Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Merge 9.0. Use TclMaxListLength() to determine error-message in stead of converting to a list |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | bug-0439e1e1a3 |
Files: | files | file ages | folders |
SHA3-256: |
1870ed5dd9662b930ce1ae9e22d04bed |
User & Date: | jan.nijtmans 2024-09-24 21:46:55.373 |
Context
2024-09-25
| ||
08:34 | Rebase to 9.0 check-in: 09370a59d0 user: jan.nijtmans tags: bug-0439e1e1a3 | |
07:38 | Modify fix for [0439e1e1a3], no conversion to list any more. Reported by AKU. check-in: 53e5096b31 user: jan.nijtmans tags: trunk, main | |
2024-09-24
| ||
21:46 | Merge 9.0. Use TclMaxListLength() to determine error-message in stead of converting to a list check-in: 1870ed5dd9 user: jan.nijtmans tags: bug-0439e1e1a3 | |
2024-09-22
| ||
16:22 | Fix [e38dce74e2]: Command line built with list not properly quoted check-in: 8627aad9bd user: jan.nijtmans tags: trunk, main | |
2024-07-09
| ||
13:37 | [0439e1e1a3]: Slow detection of illegal expr argument. Handle more of the same. check-in: 5d33330757 user: jan.nijtmans tags: bug-0439e1e1a3 | |
Changes
Changes to README.md.
1 2 | # README: Tcl | | | 1 2 3 4 5 6 7 8 9 10 | # README: Tcl This is the **Tcl 9.0b4** source distribution. You can get any source release of Tcl from [our distribution site](https://sourceforge.net/projects/tcl/files/Tcl/). 8.6 (production release, daily build) [](https://github.com/tcltk/tcl/actions?query=workflow%3A%22Linux%22+branch%3Acore-8-6-branch) [](https://github.com/tcltk/tcl/actions?query=workflow%3A%22Windows%22+branch%3Acore-8-6-branch) |
︙ | ︙ |
Changes to changes.md.
1 2 3 4 5 6 | The source code for Tcl is managed by fossil. Tcl developers coordinate all changes to the Tcl source code at > [Tcl Source Code](https://core.tcl-lang.org/tcl/timeline) | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | The source code for Tcl is managed by fossil. Tcl developers coordinate all changes to the Tcl source code at > [Tcl Source Code](https://core.tcl-lang.org/tcl/timeline) Release Tcl 9.0b4 arises from the check-in with tag core-9-0-b4. Highlighted differences between Tcl 9.0 and Tcl 8.6 are summarized below, with focus on changes important to programmers using the Tcl library and writing Tcl scripts. ## 64-bit capacity: Data values larger than 2Gb |
︙ | ︙ | |||
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | - Removed the "identity" encoding. - Removed the encoding alias "binary" to "iso8859-1". - $::tcl_precision no longer controls string generation of doubles - Removed Tcl 7 legacies: [case], [puts] [read] variant syntaxes - Removed subcommands [trace variable|vdelete|vinfo] - No -eofchar option for channels anymore for writing. - On Windows 10+ (Version 1903 or higher), system encoding is always utf-8. - Removed command ::tcl::unsupported::inject. ## Incompatibilities in C public interface - Many arguments expanded type from int to Tcl_Size - Ended support for Tcl_ChannelTypeVersion less than 5 - Introduced versioning of the Tcl_ObjType struct - Removed macros CONST*: Tcl 9 support means dropping Tcl 8.3 support - Removed routines: > Tcl_Backslash(), Tcl_*VA(), Tcl_*MathFunc*(), Tcl_MakeSafe(), > Tcl_(Save|Restore|Discard|Free)Result(), Tcl_EvalTokens(), > Tcl_(Get|Set)DefaultEncodingDir(), > Tcl_UniCharN(case)cmp(), Tcl_UniCharCaseMatch() ## New commands - `array default`, `array for` - `chan isbinary` - `coroinject`, `coroprobe` - `clock add weekdays` - `const`, `info const*` | > > > | > > | > | > | > > > | 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | - Removed the "identity" encoding. - Removed the encoding alias "binary" to "iso8859-1". - $::tcl_precision no longer controls string generation of doubles - Removed Tcl 7 legacies: [case], [puts] [read] variant syntaxes - Removed subcommands [trace variable|vdelete|vinfo] - No -eofchar option for channels anymore for writing. - On Windows 10+ (Version 1903 or higher), system encoding is always utf-8. - %b/%d/%o/%x format modifiers (without size modifier) for "format" and "scan" always truncate to 32-bits on all platforms. - %L size modifier for "scan" no longer truncates to 64-bit. - Removed command ::tcl::unsupported::inject. ## Incompatibilities in C public interface - Many arguments expanded type from int to Tcl_Size - Ended support for Tcl_ChannelTypeVersion less than 5 - Introduced versioning of the Tcl_ObjType struct - Removed macros CONST*: Tcl 9 support means dropping Tcl 8.3 support - Removed routines: > Tcl_Backslash(), Tcl_*VA(), Tcl_*MathFunc*(), Tcl_MakeSafe(), > Tcl_(Save|Restore|Discard|Free)Result(), Tcl_EvalTokens(), > Tcl_(Get|Set)DefaultEncodingDir(), > Tcl_UniCharN(case)cmp(), Tcl_UniCharCaseMatch() ## New commands - `array default`, `array for` - `chan isbinary` - `coroinject`, `coroprobe` - `clock add weekdays` - `const`, `info const*` - `dict getwithdefault` - `file tempdir`, `file home`, `file tildeexpand` - `info commandtype` - `ledit` - `lpop` - `lremove` - `lseq` - `package files` - `string insert`, `string is dict` - `tcl::process` - `*::build-info` - `readFile`, `writeFile`, `foreachLine` - `tcl::idna::*` ## New command options - `clock scan ... -validate ...` - `info loaded ... ?prefix?` - `lsearch ... -stride ...` - `regsub ... -command ...` - `socket ... -nodelay ... -keepalive ...` - `vwait` controlled by several new options - `expr` string comparators `lt`, `gt`, `le`, `ge` ## Numbers - 0NNN format is no longer octal interpretation. Use 0oNNN. - 0dNNNN format to compel decimal interpretation. - NN_NNN_NNN, underscores in numbers for optional readability - Functions: isinf() isnan() isnormal() issubnormal() isunordered() - `fpclassify` - Function int() no longer truncates to word size ## tcl::oo facilities - private variables and methods - class variables and methods - abstract and singleton classes - configurable properties - `method -export`, `method -unexport` |
Changes to doc/ChnlStack.3.
︙ | ︙ | |||
83 84 85 86 87 88 89 | \fBTcl_GetTopChannel\fR returns the top channel in the stack of channels the supplied channel is part of. .PP \fBTcl_GetStackedChannel\fR returns the channel in the stack of channels which is just below the supplied channel. .SH "SEE ALSO" | | | 83 84 85 86 87 88 89 90 91 92 93 | \fBTcl_GetTopChannel\fR returns the top channel in the stack of channels the supplied channel is part of. .PP \fBTcl_GetStackedChannel\fR returns the channel in the stack of channels which is just below the supplied channel. .SH "SEE ALSO" Notifier(3), Tcl_CreateChannel(3), Tcl_OpenFileChannel(3), vwait(n) .SH KEYWORDS channel, compression |
Changes to doc/CrtChnlHdlr.3.
︙ | ︙ | |||
77 78 79 80 81 82 83 | example, if there are two handlers for \fBTCL_READABLE\fR on the same channel, the first handler could consume all of the available input so that the channel is no longer readable when the second handler is invoked. For this reason it may be useful to use nonblocking I/O on channels for which there are event handlers. .SH "SEE ALSO" | | | | 77 78 79 80 81 82 83 84 85 86 | example, if there are two handlers for \fBTCL_READABLE\fR on the same channel, the first handler could consume all of the available input so that the channel is no longer readable when the second handler is invoked. For this reason it may be useful to use nonblocking I/O on channels for which there are event handlers. .SH "SEE ALSO" Notifier(3), Tcl_CreateChannel(3), Tcl_OpenFileChannel(3), vwait(n) .SH KEYWORDS blocking, callback, channel, events, handler, nonblocking |
Changes to doc/FileSystem.3.
︙ | ︙ | |||
731 732 733 734 735 736 737 | a UTF-8 string representation if that is required by some Tcl code. .PP \fBTcl_FSGetNativePath\fR is for use by the Win/Unix native filesystems, so that they can easily retrieve the native (char* or TCHAR*) representation of a path. This function is a convenience wrapper around \fBTcl_FSGetInternalRep\fR. It may be desirable in the future to have non-string-based native representations (for example, | | | 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 | a UTF-8 string representation if that is required by some Tcl code. .PP \fBTcl_FSGetNativePath\fR is for use by the Win/Unix native filesystems, so that they can easily retrieve the native (char* or TCHAR*) representation of a path. This function is a convenience wrapper around \fBTcl_FSGetInternalRep\fR. It may be desirable in the future to have non-string-based native representations (for example, on macOS, a representation using a fileSpec of FSRef structure would probably be more efficient). On Windows a full Unicode representation would allow for paths of unlimited length. Currently the representation is simply a character string which may contain either the relative path or a complete, absolute normalized path in the native encoding (complex conditions dictate which of these will be provided, so neither can be relied upon, unless the path is known to be absolute). If you need a native path which must be absolute, then you should ask for the native |
︙ | ︙ |
Changes to doc/TclZlib.3.
︙ | ︙ | |||
14 15 16 17 18 19 20 | .nf #include <tcl.h> .sp int \fBTcl_ZlibDeflate\fR(\fIinterp, format, dataObj, level, dictObj\fR) .sp int | | | 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | .nf #include <tcl.h> .sp int \fBTcl_ZlibDeflate\fR(\fIinterp, format, dataObj, level, dictObj\fR) .sp int \fBTcl_ZlibInflate\fR(\fIinterp, format, dataObj, bufferSize, dictObj\fR) .sp unsigned int \fBTcl_ZlibCRC32\fR(\fIinitValue, bytes, length\fR) .sp unsigned int \fBTcl_ZlibAdler32\fR(\fIinitValue, bytes, length\fR) .sp |
︙ | ︙ | |||
81 82 83 84 85 86 87 88 89 90 91 92 93 94 | \fIformat\fR is \fBTCL_ZLIB_FORMAT_GZIP\fR or \fBTCL_ZLIB_FORMAT_AUTO\fR. If a NULL is passed, a default header will be used on compression and the header will be ignored (apart from integrity checks) on decompression. See the section \fBGZIP OPTIONS DICTIONARY\fR for details about the contents of this dictionary. .AP "unsigned int" initValue in The initial value for the checksum algorithm. .AP "unsigned char" *bytes in An array of bytes to run the checksum algorithm over, or NULL to get the recommended initial value for the checksum algorithm. .AP Tcl_Size length in The number of bytes in the array. .AP int mode in What mode to operate the stream in. Should be either | > > > | 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | \fIformat\fR is \fBTCL_ZLIB_FORMAT_GZIP\fR or \fBTCL_ZLIB_FORMAT_AUTO\fR. If a NULL is passed, a default header will be used on compression and the header will be ignored (apart from integrity checks) on decompression. See the section \fBGZIP OPTIONS DICTIONARY\fR for details about the contents of this dictionary. .AP "unsigned int" initValue in The initial value for the checksum algorithm. .AP "Tcl_Size" bufferSize in A hint as to what size of buffer is to be used to receive the data. Use 0 to use a geric guess based on the input data. .AP "unsigned char" *bytes in An array of bytes to run the checksum algorithm over, or NULL to get the recommended initial value for the checksum algorithm. .AP Tcl_Size length in The number of bytes in the array. .AP int mode in What mode to operate the stream in. Should be either |
︙ | ︙ |
Changes to doc/apply.n.
︙ | ︙ | |||
92 93 94 95 96 97 98 | }}} set vbl 123 set vbl abc .CE .SH "SEE ALSO" proc(n), uplevel(n) .SH KEYWORDS | | | 92 93 94 95 96 97 98 99 100 101 102 | }}} set vbl 123 set vbl abc .CE .SH "SEE ALSO" proc(n), uplevel(n) .SH KEYWORDS anonymous function, argument, lambda, procedure '\" Local Variables: '\" mode: nroff '\" End: |
Changes to doc/class.n.
︙ | ︙ | |||
82 83 84 85 86 87 88 | \fIcls \fBcreateWithNamespace\fI name nsName\fR ?\fIarg ...\fR? . This creates a new instance of the class \fIcls\fR called \fIname\fR (which is resolved within the calling context's namespace if not fully qualified), passing the arguments, \fIarg ...\fR, to the constructor, and (if that returns a successful result) returning the fully qualified name of the created object (the result of the constructor is ignored). The name of the instance's | | > > > | | 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | \fIcls \fBcreateWithNamespace\fI name nsName\fR ?\fIarg ...\fR? . This creates a new instance of the class \fIcls\fR called \fIname\fR (which is resolved within the calling context's namespace if not fully qualified), passing the arguments, \fIarg ...\fR, to the constructor, and (if that returns a successful result) returning the fully qualified name of the created object (the result of the constructor is ignored). The name of the instance's internal namespace will be \fInsName\fR; .VS it is an error if that namespace cannot be created. .VE If the constructor fails (i.e., returns a non-OK result) then the object is destroyed and the error message is the result of this method call. .SH EXAMPLES .PP This example defines a simple class hierarchy and creates a new instance of it. It then invokes a method of the object before destroying the hierarchy and showing that the destruction is transitive. |
︙ | ︙ |
Changes to doc/clock.n.
︙ | ︙ | |||
97 98 99 100 101 102 103 | 1 January 1970, 00:00 UTC. Note that the count of seconds does not include any leap seconds; seconds are counted as if each UTC day has exactly 86400 seconds. Tcl responds to leap seconds by speeding or slowing its clock by a tiny fraction for some minutes until it is back in sync with UTC; its data model does not represent minutes that have 59 or 61 seconds. .TP | | | | | | 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 | 1 January 1970, 00:00 UTC. Note that the count of seconds does not include any leap seconds; seconds are counted as if each UTC day has exactly 86400 seconds. Tcl responds to leap seconds by speeding or slowing its clock by a tiny fraction for some minutes until it is back in sync with UTC; its data model does not represent minutes that have 59 or 61 seconds. .TP \fInow\fR Instead of \fItimeVal\fR a non-integer value \fBnow\fR can be used as replacement for today, which is simply interpolated to the runt-time as value of \fBclock seconds\fR. For example: .sp \fBclock format now -f %a; # current day of the week\fR .sp \fBclock add now 1 month; # next month\fR .TP \fIunit\fR . One of the words, \fBseconds\fR, \fBminutes\fR, \fBhours\fR, \fBdays\fR, \fBweekdays\fR, \fBweeks\fR, \fBmonths\fR, or \fByears\fR. Used in conjunction with \fIcount\fR to identify an interval of time, for example, \fI3 seconds\fR or \fI1 year\fR. |
︙ | ︙ | |||
128 129 130 131 132 133 134 | .TP \fB\-format\fR format . Specifies the desired output format for \fBclock format\fR or the expected input format for \fBclock scan\fR. The \fIformat\fR string consists of any number of characters other than the per-cent sign .PQ \fB%\fR | | | 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 | .TP \fB\-format\fR format . Specifies the desired output format for \fBclock format\fR or the expected input format for \fBclock scan\fR. The \fIformat\fR string consists of any number of characters other than the per-cent sign .PQ \fB%\fR interspersed with any number of \fIformat groups\fR, which are two- or three-character sequences beginning with the per-cent sign. The permissible format groups, and their interpretation, are described under \fBFORMAT GROUPS\fR. .RS .PP On \fBclock format\fR, the default format is .PP .CS |
︙ | ︙ | |||
190 191 192 193 194 195 196 197 198 199 200 201 202 203 | .IP [1] the environment variable \fBTCL_TZ\fR. .IP [2] the environment variable \fBTZ\fR. .IP [3] on Windows systems, the time zone settings from the Control Panel. .RE .PP If none of these is present, the C \fBlocaltime\fR and \fBmktime\fR functions are used to attempt to convert times between local and Greenwich. On 32-bit systems, this approach is likely to have bugs, particularly for times that lie outside the window (approximately the years 1902 to 2037) that can be represented in a 32-bit integer. .SH "CLOCK ARITHMETIC" | > > > > > > > > > | 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 | .IP [1] the environment variable \fBTCL_TZ\fR. .IP [2] the environment variable \fBTZ\fR. .IP [3] on Windows systems, the time zone settings from the Control Panel. .RE .\" OPTION: -validate .TP \fB\-validate\fR boolean . If \fIboolean\fR is true (default), \fBclock scan\fR will raise an error if the input contains invalid values, e.g. day of month greater than number of days in the month. If specified as false, the command makes an adjustment to bring values within acceptable range. See \fBSCANNING TIMES\fR for details. .PP If none of these is present, the C \fBlocaltime\fR and \fBmktime\fR functions are used to attempt to convert times between local and Greenwich. On 32-bit systems, this approach is likely to have bugs, particularly for times that lie outside the window (approximately the years 1902 to 2037) that can be represented in a 32-bit integer. .SH "CLOCK ARITHMETIC" |
︙ | ︙ | |||
488 489 490 491 492 493 494 | in the same day, once without and once with Daylight Saving Time. If this situation occurs, the first occurrence of the time is chosen. (For this reason, it is wise to have the input string contain the time zone when converting local times. This caveat does not apply to UTC times.) .PP If the interpretation of the groups yields an impossible time because | > > | | 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 | in the same day, once without and once with Daylight Saving Time. If this situation occurs, the first occurrence of the time is chosen. (For this reason, it is wise to have the input string contain the time zone when converting local times. This caveat does not apply to UTC times.) .PP If the interpretation of the groups yields an impossible time because a field is out of range, an exception is raised if the \fB-validate\fR option is not present or passed as true. If passed as false, enough of that field's unit will be added to or subtracted from the time to bring it in range. Thus, if attempting to scan or format day 0 of the month, one day will be subtracted from day 1 of the month, yielding the last day of the previous month. .PP If the interpretation of the groups yields an impossible time because a Daylight Saving Time change skips over that time, or an ambiguous time because a Daylight Saving Time change skips back so that the clock |
︙ | ︙ | |||
569 570 571 572 573 574 575 | On output, produces a string of digits giving the Astronomical Julian Date or Astronomical Julian Day Number (JDN/JD). In opposite to calendar julian day \fB%J\fR, it starts the day at noon. On input, accepts a string of digits (or floating point with the time fraction) and interprets it as an Astronomical Julian Day Number (JDN/JD). The Astronomical Julian Date is a count of the number of calendar days that have elapsed since 1 January, 4713 BCE of the proleptic | | | | 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 | On output, produces a string of digits giving the Astronomical Julian Date or Astronomical Julian Day Number (JDN/JD). In opposite to calendar julian day \fB%J\fR, it starts the day at noon. On input, accepts a string of digits (or floating point with the time fraction) and interprets it as an Astronomical Julian Day Number (JDN/JD). The Astronomical Julian Date is a count of the number of calendar days that have elapsed since 1 January, 4713 BCE of the proleptic Julian calendar, which contains also the time fraction (after floating point). The epoch time of 1 January 1970 corresponds to Astronomical JDN 2440587.5. This value corresponds the julian day used in sqlite-database, and is the same as result of \fBselect julianday(:seconds, 'unixepoch')\fR. .IP \fB%EJ\fR On output, produces a string of digits giving the Calendar Julian Date. In opposite to julian day \fB%J\fR format group, it produces float number. In opposite to astronomical julian day \fB%Ej\fR group, it starts at midnight. On input, accepts a string of digits (or floating point with the time fraction) and interprets it as a Calendar Julian Day Number. The Calendar Julian Date is a count of the number of calendar days that have elapsed since 1 January, 4713 BCE of the proleptic Julian calendar, which contains also the time fraction (after floating point). The epoch time of 1 January 1970 corresponds to Astronomical JDN 2440588. .IP \fB%Es\fR This affects similar to \fB%s\fR, but in opposition to \fB%s\fR it parses or formats local seconds (not the posix seconds). Because \fB%s\fR has the same precedence as \fB%s\fR (uniquely determines a point in time), it overrides all other input formats. .IP \fB%Ex\fR |
︙ | ︙ | |||
627 628 629 630 631 632 633 | .IP \fB%I\fR On output, produces a two-digit number giving the hour of the day (12-11) on a 12-hour clock. On input, accepts such a number. .IP \fB%j\fR On output, produces a three-digit number giving the day of the year (001-366). On input, accepts such a number. .IP \fB%J\fR | | | 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 | .IP \fB%I\fR On output, produces a two-digit number giving the hour of the day (12-11) on a 12-hour clock. On input, accepts such a number. .IP \fB%j\fR On output, produces a three-digit number giving the day of the year (001-366). On input, accepts such a number. .IP \fB%J\fR On output, produces a string of digits giving the Julian Day Number. On input, accepts a string of digits and interprets it as a Julian Day Number. The Julian Day Number is a count of the number of calendar days that have elapsed since 1 January, 4713 BCE of the proleptic Julian calendar. The epoch time of 1 January 1970 corresponds to Julian Day Number 2440588. .IP \fB%k\fR On output, produces a one- or two-digit number giving the hour of the day |
︙ | ︙ | |||
918 919 920 921 922 923 924 | acceptable formats are .QW "\fImm\fB/\fIdd\fR?\fB/\fIyy\fR?" , .QW "\fImonthname dd\fR?\fB, \fIyy\fR?" , .QW "\fIday\fB, \fIdd monthname \fR?\fIyy\fR?" , .QW "\fIdd monthname yy\fR" , .QW "?\fICC\fR?\fIyymmdd\fR" , and | | | 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 | acceptable formats are .QW "\fImm\fB/\fIdd\fR?\fB/\fIyy\fR?" , .QW "\fImonthname dd\fR?\fB, \fIyy\fR?" , .QW "\fIday\fB, \fIdd monthname \fR?\fIyy\fR?" , .QW "\fIdd monthname yy\fR" , .QW "?\fICC\fR?\fIyymmdd\fR" , and .QW "\fIdd\fB-\fImonthname\fB-\fR?\fICC\fR?\fIyy\fR" . The default year is the current year. If the year is less than 100, we treat the years 00-68 as 2000-2068 and the years 69-99 as 1969-1999. Not all platforms can represent the years 38-70, so an error may result if these years are used. .TP \fIISO 8601 point-in-time\fR . |
︙ | ︙ |
Changes to doc/coroutine.n.
︙ | ︙ | |||
94 95 96 97 98 99 100 | with quite a bit of similarity to \fBcoroprobe\fR. However, with \fBcoroinject\fR there are several key differences: .VE "8.7, TIP383" .IP \(bu .VS "8.7, TIP383" The coroutine is not immediately resumed after the injection has been done. A consequence of this is that multiple injections may be done before the | | | 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 | with quite a bit of similarity to \fBcoroprobe\fR. However, with \fBcoroinject\fR there are several key differences: .VE "8.7, TIP383" .IP \(bu .VS "8.7, TIP383" The coroutine is not immediately resumed after the injection has been done. A consequence of this is that multiple injections may be done before the coroutine is resumed. The injected commands are performed in \fIreverse order of definition\fR (that is, they are internally stored on a stack). .VE "8.7, TIP383" .IP \(bu .VS "8.7, TIP383" An additional two arguments are appended to the list of arguments to be run (that is, the \fIcommand\fR and its \fIargs\fR are extended by two elements). The first is the name of the command that suspended the coroutine (\fByield\fR |
︙ | ︙ | |||
241 242 243 244 245 246 247 | \fIcollect\fR rst # ==> Received 'rst' at a yield in ::collect \fIcollect\fR xyz puts [\fIcollect\fR] # ==> 123 {abc def} 456 pqr RST xyz .CE | < < < < | 241 242 243 244 245 246 247 248 249 250 251 252 253 254 | \fIcollect\fR rst # ==> Received 'rst' at a yield in ::collect \fIcollect\fR xyz puts [\fIcollect\fR] # ==> 123 {abc def} 456 pqr RST xyz .CE .VE "8.7, TIP383" .SS "DETAILED SEMANTICS" .PP This example demonstrates that coroutines start from the global namespace, and that \fIcommand\fR resolution happens before the coroutine stack is created. .PP .CS |
︙ | ︙ |
Changes to doc/exec.n.
︙ | ︙ | |||
331 332 333 334 335 336 337 | .PP In order to execute shell built-in commands like \fBdir\fR and \fBcopy\fR, the caller must prepend the desired command with .QW "\fBcmd.exe /c\0\fR" because built-in commands are not implemented using executables. .RE .TP | | | 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 | .PP In order to execute shell built-in commands like \fBdir\fR and \fBcopy\fR, the caller must prepend the desired command with .QW "\fBcmd.exe /c\0\fR" because built-in commands are not implemented using executables. .RE .TP \fBUnix\fR (including macOS) . The \fBexec\fR command is fully functional and works as described. .SH "UNIX EXAMPLES" .PP Here are some examples of the use of the \fBexec\fR command on Unix. To execute a simple program and get its result: .PP |
︙ | ︙ |
Changes to doc/file.n.
︙ | ︙ | |||
74 75 76 77 78 79 80 | attribute of the file. \fB\-shortname\fR gives a string where every path element is replaced with its short (8.3) version of the name if possible. For path elements that cannot be mapped to short names, the long name is retained. This attribute cannot be set. \fB\-system\fR gives or sets or clears the value of the system attribute of the file. .PP | | | 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | attribute of the file. \fB\-shortname\fR gives a string where every path element is replaced with its short (8.3) version of the name if possible. For path elements that cannot be mapped to short names, the long name is retained. This attribute cannot be set. \fB\-system\fR gives or sets or clears the value of the system attribute of the file. .PP On macOS and Darwin, \fB\-creator\fR gives or sets the Finder creator type of the file. \fB\-hidden\fR gives or sets or clears the hidden attribute of the file. \fB\-readonly\fR gives or sets or clears the readonly attribute of the file. \fB\-rsrclength\fR gives the length of the resource fork of the file, this attribute can only be set to the value 0, which results in the resource fork being stripped off the file. .PP |
︙ | ︙ |
Changes to doc/filename.n.
︙ | ︙ | |||
38 39 40 41 42 43 44 | .SH "PATH SYNTAX" .PP The rules for native names depend on the value reported in the Tcl \fBplatform\fR element of the \fBtcl_platform\fR array: .TP 10 \fBUnix\fR . | | | 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | .SH "PATH SYNTAX" .PP The rules for native names depend on the value reported in the Tcl \fBplatform\fR element of the \fBtcl_platform\fR array: .TP 10 \fBUnix\fR . On Unix and Apple macOS platforms, Tcl uses path names where the components are separated by slashes. Path names may be relative or absolute, and file names may contain any character other than slash. The file names \fB\&.\fR and \fB\&..\fR are special and refer to the current directory and the parent of the current directory respectively. Multiple adjacent slash characters are interpreted as a single separator, except for the first double slash \fB//\fR in absolute paths. Any number of trailing slash characters at the end of a |
︙ | ︙ | |||
151 152 153 154 155 156 157 | \fBtclvars\fR and \fBtm\fR. When any path in an environment variable used to initialize these starts with a tilde, it will be interpreted as if the first element is replaced with the location of the home directory for the given user. If the tilde is followed immediately by a separator, the \fB$HOME\fR environment variable is substituted. Otherwise the characters between the tilde and the next separator are taken as a user name, which is used to retrieve the user's home directory for substitution. This works on | | | 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 | \fBtclvars\fR and \fBtm\fR. When any path in an environment variable used to initialize these starts with a tilde, it will be interpreted as if the first element is replaced with the location of the home directory for the given user. If the tilde is followed immediately by a separator, the \fB$HOME\fR environment variable is substituted. Otherwise the characters between the tilde and the next separator are taken as a user name, which is used to retrieve the user's home directory for substitution. This works on POSIX, macOS and Windows platforms. .SH "PORTABILITY ISSUES" .PP Not all file systems are case sensitive, so scripts should avoid code that depends on the case of characters in a file name. In addition, the character sets allowed on different devices may differ, so scripts should choose file names that do not contain special characters like: \fB<>:?"/\e|\fR. |
︙ | ︙ |
Changes to doc/glob.n.
︙ | ︙ | |||
98 99 100 101 102 103 104 | or if the target of a link matches the requested type. So, a link to a directory will be returned if \fB\-types d\fR was specified. .RS .PP The second form specifies types where all the types given must match. These are \fIr\fR, \fIw\fR, \fIx\fR as file permissions, and \fIreadonly\fR, \fIhidden\fR as special permission cases. On the | | | | | 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | or if the target of a link matches the requested type. So, a link to a directory will be returned if \fB\-types d\fR was specified. .RS .PP The second form specifies types where all the types given must match. These are \fIr\fR, \fIw\fR, \fIx\fR as file permissions, and \fIreadonly\fR, \fIhidden\fR as special permission cases. On the Macintosh, macOS types and creators are also supported, where any item which is four characters long is assumed to be a macOS type (e.g. \fBTEXT\fR). Items which are of the form \fI{macintosh type XXXX}\fR or \fI{macintosh creator XXXX}\fR will match types or creators respectively. Unrecognized types, or specifications of multiple macOS types/creators will signal an error. .PP The two forms may be mixed, so \fB\-types {d f r w}\fR will find all regular files OR directories that have both read AND write permissions. The following are equivalent: .PP .CS |
︙ | ︙ |
Changes to doc/info.n.
︙ | ︙ | |||
278 279 280 281 282 283 284 | .TP \fBinfo library\fR . Returns the value of \fBtcl_library\fR, which is the name of the library directory in which the scripts distributed with Tcl scripts are stored. .\" METHOD: loaded .TP | | | | | | 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 | .TP \fBinfo library\fR . Returns the value of \fBtcl_library\fR, which is the name of the library directory in which the scripts distributed with Tcl scripts are stored. .\" METHOD: loaded .TP \fBinfo loaded \fR?\fIinterp\fR? ?\fIprefix\fR? . Returns the name of each file loaded in \fIinterp\fR by the \fBload\fR command with prefix \fIprefix\fR . If \fIprefix\fR is not given, returns a list where each item is the name of the loaded file and the prefix for which the file was loaded. For a statically-loaded package the name of the file is the empty string. For \fIinterp\fR, the empty string is the current interpreter. .\" METHOD: locals .TP \fBinfo locals \fR?\fIpattern\fR? . If \fIpattern\fR is given, returns the name of each local variable matching |
︙ | ︙ |
Changes to doc/interp.n.
︙ | ︙ | |||
640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 | \fBlsort\fR \fBnamespace\fR \fBpackage\fR \fBpid\fR \fBproc\fR \fBputs\fR \fBread\fR \fBregexp\fR \fBregsub\fR \fBrename\fR \fBreturn\fR \fBscan\fR \fBseek\fR \fBset\fR \fBsplit\fR \fBstring\fR \fBsubst\fR \fBswitch\fR \fBtell\fR \fBtime\fR \fBtrace\fR \fBunset\fR \fBupdate\fR \fBuplevel\fR \fBupvar\fR \fBvariable\fR \fBvwait\fR \fBwhile\fR .DE The following commands are hidden by \fBinterp create\fR when it creates a safe interpreter: .DS .ta 1.2i 2.4i 3.6i \fBcd\fR \fBencoding\fR \fBexec\fR \fBexit\fR \fBfconfigure\fR \fBfile\fR \fBglob\fR \fBload\fR \fBopen\fR \fBpwd\fR \fBsocket\fR \fBsource\fR | > | | 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 | \fBlsort\fR \fBnamespace\fR \fBpackage\fR \fBpid\fR \fBproc\fR \fBputs\fR \fBread\fR \fBregexp\fR \fBregsub\fR \fBrename\fR \fBreturn\fR \fBscan\fR \fBseek\fR \fBset\fR \fBsplit\fR \fBstring\fR \fBsubst\fR \fBswitch\fR \fBtell\fR \fBtime\fR \fBtrace\fR \fBunset\fR \fBupdate\fR \fBuplevel\fR \fBupvar\fR \fBvariable\fR \fBvwait\fR \fBwhile\fR \fBzlib\fR .DE The following commands are hidden by \fBinterp create\fR when it creates a safe interpreter: .DS .ta 1.2i 2.4i 3.6i \fBcd\fR \fBencoding\fR \fBexec\fR \fBexit\fR \fBfconfigure\fR \fBfile\fR \fBglob\fR \fBload\fR \fBopen\fR \fBpwd\fR \fBsocket\fR \fBsource\fR \fBunload\fR \fBzipfs\fR .DE These commands can be recreated later as Tcl procedures or aliases, or re-exposed by \fBinterp expose\fR. .PP The following commands from Tcl's library of support procedures are not present in a safe interpreter: .DS |
︙ | ︙ |
Changes to doc/library.n.
1 2 3 4 5 6 7 8 9 10 11 | '\" '\" Copyright (c) 1991-1993 The Regents of the University of California. '\" Copyright (c) 1994-1996 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" .TH library n "8.0" Tcl "Tcl Built-In Commands" .so man.macros .BS .SH NAME | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | '\" '\" Copyright (c) 1991-1993 The Regents of the University of California. '\" Copyright (c) 1994-1996 Sun Microsystems, Inc. '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" .TH library n "8.0" Tcl "Tcl Built-In Commands" .so man.macros .BS .SH NAME auto_execok, auto_import, auto_load, auto_mkindex, auto_qualify, auto_reset, foreachLine, parray, readFile, tcl_findLibrary, tcl_endOfWord, tcl_startOfNextWord, tcl_startOfPreviousWord, tcl_wordBreakAfter, tcl_wordBreakBefore, writeFile \- standard library of Tcl procedures .SH SYNOPSIS .nf \fBauto_execok \fIcmd\fR \fBauto_import \fIpattern\fR \fBauto_load \fIcmd\fR \fBauto_mkindex \fIdir pattern pattern ...\fR \fBauto_qualify \fIcommand namespace\fR |
︙ | ︙ |
Changes to doc/load.n.
︙ | ︙ | |||
79 80 81 82 83 84 85 | by calling the \fBTcl_StaticLibrary\fR procedure. If \fIfileName\fR is an empty string, then \fIprefix\fR must be specified. .PP If \fIprefix\fR is omitted or specified as an empty string, Tcl tries to guess the prefix by taking the last element of \fIfileName\fR, strip off the first three characters if they | | | | | 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | by calling the \fBTcl_StaticLibrary\fR procedure. If \fIfileName\fR is an empty string, then \fIprefix\fR must be specified. .PP If \fIprefix\fR is omitted or specified as an empty string, Tcl tries to guess the prefix by taking the last element of \fIfileName\fR, strip off the first three characters if they are \fBlib\fR, then strip off the next four characters if they are \fBtcl9\fR, and use any following wordchars but not digits, converted to titlecase as the prefix. For example, the command \fBload libxyz4.2.so\fR uses the prefix \fBXyz\fR and the command \fBload bin/last.so {}\fR uses the prefix \fBLast\fR. .PP If \fIfileName\fR is an empty string, then \fIprefix\fR must be specified. The \fBload\fR command first searches for a statically loaded library |
︙ | ︙ |
Changes to doc/lseq.n.
︙ | ︙ | |||
59 60 61 62 63 64 65 | elements, and if \fIcount\fR is not supplied, it is computed as: .RS .PP .CS \fIcount\fR = int( (\fIend\fR - \fIstart\fR + \fIstep\fR) / \fIstep\fR ) .CE .RE | < < < < < < | 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | elements, and if \fIcount\fR is not supplied, it is computed as: .RS .PP .CS \fIcount\fR = int( (\fIend\fR - \fIstart\fR + \fIstep\fR) / \fIstep\fR ) .CE .RE .SH EXAMPLES .CS .\" \fBlseq\fR 3 \fI\(-> 0 1 2\fR \fBlseq\fR 3 0 |
︙ | ︙ |
Changes to doc/msgcat.n.
︙ | ︙ | |||
24 25 26 27 28 29 30 | \fB::msgcat::mcpackagenamespaceget\fR .VE "TIP 490" \fB::msgcat::mclocale \fR?\fInewLocale\fR? .VS "TIP 499" \fB::msgcat::mcpreferences\fR ?\fIlocale preference\fR? ... .VE "TIP 499" .VS "TIP 412" | | | 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | \fB::msgcat::mcpackagenamespaceget\fR .VE "TIP 490" \fB::msgcat::mclocale \fR?\fInewLocale\fR? .VS "TIP 499" \fB::msgcat::mcpreferences\fR ?\fIlocale preference\fR? ... .VE "TIP 499" .VS "TIP 412" \fB::msgcat::mcloadedlocales subcommand\fR .VE "TIP 412" \fB::msgcat::mcload \fIdirname\fR \fB::msgcat::mcset \fIlocale src-string \fR?\fItranslate-string\fR? \fB::msgcat::mcmset \fIlocale src-trans-list\fR \fB::msgcat::mcflset \fIsrc-string \fR?\fItranslate-string\fR? \fB::msgcat::mcflmset \fIsrc-trans-list\fR \fB::msgcat::mcunknown \fIlocale src-string\fR ?\fIarg arg ...\fR? |
︙ | ︙ | |||
94 95 96 97 98 99 100 | \fB::msgcat::mc\fR is the main function used to localize an application. Instead of using an English string directly, an application can pass the English string through \fB::msgcat::mc\fR and use the result. If an application is written for a single language in this fashion, then it is easy to add support for additional languages later simply by defining new message catalog entries. .RE | | | 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 | \fB::msgcat::mc\fR is the main function used to localize an application. Instead of using an English string directly, an application can pass the English string through \fB::msgcat::mc\fR and use the result. If an application is written for a single language in this fashion, then it is easy to add support for additional languages later simply by defining new message catalog entries. .RE .\" COMMAND: mcn .TP \fB::msgcat::mcn \fInamespace src-string\fR ?\fIarg arg ...\fR? .VS "TIP 490" Like \fB::msgcat::mc\fR, but with the message namespace specified as first argument. .PP .RS |
︙ | ︙ | |||
218 219 220 221 222 223 224 | .CS ::msgcat::mcpreferences fr en {} .CE .RE .PP .\" COMMAND: mcloadedlocales .TP | | | 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 | .CS ::msgcat::mcpreferences fr en {} .CE .RE .PP .\" COMMAND: mcloadedlocales .TP \fB::msgcat::mcloadedlocales subcommand\fR .VS "TIP 499" This group of commands manage the list of loaded locales for packages not setting a package locale. .PP .RS The subcommand \fBloaded\fR returns the list of currently loaded locales. .PP |
︙ | ︙ | |||
378 379 380 381 382 383 384 | .PP .CS language[_country][_modifier] .CE .PP On Windows and Cygwin, if none of those environment variables is set, msgcat will attempt to extract locale information from the registry. | | | < | 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 | .PP .CS language[_country][_modifier] .CE .PP On Windows and Cygwin, if none of those environment variables is set, msgcat will attempt to extract locale information from the registry. The RFC4747 locale name "lang-script-country-options" is transformed to the locale as "lang_country_script" (Example: sr-Latn-CS -> sr_cs_latin). If all these attempts to discover an initial locale from the user's environment fail, msgcat defaults to an initial locale of .QW C . .PP When a locale is specified by the user, a .QW "best match" search is performed during string translation. For example, if a user |
︙ | ︙ | |||
594 595 596 597 598 599 600 | .PP .RS .VS "TIP 499" If a set of locale preferences is given, it is set as package locale preference list. The package locale is set to the first element of the preference list. A package locale is activated, if it was not set so far. .PP | | | 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 | .PP .RS .VS "TIP 499" If a set of locale preferences is given, it is set as package locale preference list. The package locale is set to the first element of the preference list. A package locale is activated, if it was not set so far. .PP Locale preferences are loaded now for the package, if not yet loaded. .VE "TIP 499" .RE .PP .\" METHOD: loaded .TP \fB::msgcat::mcpackagelocale loaded\fR . |
︙ | ︙ |
Changes to doc/object.n.
︙ | ︙ | |||
62 63 64 65 66 67 68 69 70 71 72 73 74 75 | .\" METHOD: eval .TP \fIobj \fBeval\fR ?\fIarg ...\fR? . This method concatenates the arguments, \fIarg\fR, as if with \fBconcat\fR, and then evaluates the resulting script in the namespace that is uniquely associated with \fIobj\fR, returning the result of the evaluation. .\" METHOD: unknown .TP \fIobj \fBunknown ?\fImethodName\fR? ?\fIarg ...\fR? . This method is called when an attempt to invoke the method \fImethodName\fR on object \fIobj\fR fails. The arguments that the user supplied to the method are given as \fIarg\fR arguments. | > > > > > | 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | .\" METHOD: eval .TP \fIobj \fBeval\fR ?\fIarg ...\fR? . This method concatenates the arguments, \fIarg\fR, as if with \fBconcat\fR, and then evaluates the resulting script in the namespace that is uniquely associated with \fIobj\fR, returning the result of the evaluation. .RS .PP Note that object-internal commands such as \fBmy\fR and \fBself\fR can be invoked in this context. .RE .\" METHOD: unknown .TP \fIobj \fBunknown ?\fImethodName\fR? ?\fIarg ...\fR? . This method is called when an attempt to invoke the method \fImethodName\fR on object \fIobj\fR fails. The arguments that the user supplied to the method are given as \fIarg\fR arguments. |
︙ | ︙ |
Changes to doc/prefix.n.
︙ | ︙ | |||
31 32 33 34 35 36 37 | .TP \fB::tcl::prefix longest\fI table string\fR . Returns the longest common prefix of all elements in \fItable\fR that begin with the prefix \fIstring\fR. .\" METHOD: match .TP | | | | 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | .TP \fB::tcl::prefix longest\fI table string\fR . Returns the longest common prefix of all elements in \fItable\fR that begin with the prefix \fIstring\fR. .\" METHOD: match .TP \fB::tcl::prefix match\fR ?\fIoption ...\fR? \fItable string\fR . If \fIstring\fR equals one element in \fItable\fR or is a prefix to exactly one element, the matched element is returned. If not, the result depends on the \fB\-error\fR option. (It is recommended that the \fItable\fR be sorted before use with this subcommand, so that the list of matches presented in the error message also becomes sorted, though this is not strictly necessary for the operation of this subcommand itself.) The following options are supported: .RS .\" OPTION: -exact .TP \fB\-exact\fR . Accept only exact matches. .\" OPTION: -message |
︙ | ︙ |
Changes to doc/re_syntax.n.
1 2 3 4 5 6 7 8 | '\" '\" Copyright (c) 1998 Sun Microsystems, Inc. '\" Copyright (c) 1999 Scriptics Corporation '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" .so man.macros | < < | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | '\" '\" Copyright (c) 1998 Sun Microsystems, Inc. '\" Copyright (c) 1999 Scriptics Corporation '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" .so man.macros .TH re_syntax n "8.1" Tcl "Tcl Built-In Commands" .BS .SH NAME re_syntax \- Syntax of Tcl regular expressions .BE .SH DESCRIPTION .PP |
︙ | ︙ |
Changes to doc/safe.n.
︙ | ︙ | |||
303 304 305 306 307 308 309 | Additionally, the shared object file must contain a safe entry point; see the manual page for the \fBload\fR command for more details. .TP \fBfile\fR ?\fIsubcommand args...\fR? . The \fBfile\fR alias provides access to a safe subset of the subcommands of the \fBfile\fR command; it allows only \fBdirname\fR, \fBjoin\fR, | | | 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 | Additionally, the shared object file must contain a safe entry point; see the manual page for the \fBload\fR command for more details. .TP \fBfile\fR ?\fIsubcommand args...\fR? . The \fBfile\fR alias provides access to a safe subset of the subcommands of the \fBfile\fR command; it allows only \fBdirname\fR, \fBjoin\fR, \fBextension\fR, \fBroot\fR, \fBtail\fR, \fBpathtype\fR and \fBsplit\fR subcommands. For more details on what these subcommands do see the manual page for the \fBfile\fR command. .TP \fBencoding\fR ?\fIsubcommand args...\fR? . The \fBencoding\fR alias provides access to a safe subset of the subcommands of the \fBencoding\fR command; it disallows setting of |
︙ | ︙ |
Changes to doc/tclsh.1.
︙ | ︙ | |||
152 153 154 155 156 157 158 | The variable \fBtcl_prompt2\fR is used in a similar way when a newline is typed but the current command is not yet complete; if \fBtcl_prompt2\fR is not set then no prompt is output for incomplete commands. .SH "STANDARD CHANNELS" .PP See \fBTcl_StandardChannels\fR for more explanations. | | | > > > > | | | 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 | The variable \fBtcl_prompt2\fR is used in a similar way when a newline is typed but the current command is not yet complete; if \fBtcl_prompt2\fR is not set then no prompt is output for incomplete commands. .SH "STANDARD CHANNELS" .PP See \fBTcl_StandardChannels\fR for more explanations. .SH "ZIPFS VIRTUAL FILE SYSTEM" .PP When a zipfile is concatenated to the end of a \fBtclsh\fR, on startup the contents of the zip archive will be mounted under a virtual file system (VFS). The root of that VFS can be retrieved using the \fBzipfs root\fR command. The zip archive is mounted under the \fBapp\fR directory within the VFS. If a file named \fBmain.tcl\fR is present in the top level directory of the zip archive, it will be sourced instead of tclsh's normal command line handing. If a top level directory \fBtcl_library\fR is present in the zip archive, it will become the directory loaded as env(TCL_LIBRARY). If a file named \fBmain.tcl\fR is present in the top level directory of the zip archive, it will be sourced instead of the shell's normal command line handling. .PP Only one zipfile can be concatenated to the end of executable image (tclsh, or wish). However, if multiple zipfiles are concatenated, only the last one is used. This filesystem is read-only. Files cannot be added or modified within this mounted file system. See zipfs(n) for complete details. |
︙ | ︙ |
Changes to doc/zipfs.3.
︙ | ︙ | |||
56 57 58 59 60 61 62 | .BE .SH DESCRIPTION \fBTclZipfs_AppHook\fR is a utility function to perform standard application initialization procedures, taking into account available ZIP archives as follows: .IP [1] If the current application has a mountable ZIP archive, that archive is | | | > | | | | | > > > | | 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | .BE .SH DESCRIPTION \fBTclZipfs_AppHook\fR is a utility function to perform standard application initialization procedures, taking into account available ZIP archives as follows: .IP [1] If the current application has a mountable ZIP archive, that archive is mounted under \fIZIPFS_VOLUME\fB/app\fR as a read-only Tcl virtual file system (VFS). The value of \fIZIPFS_VOLUME\fR can be retrieved using the Tcl command \fBzipfs root\fR. .IP [2] If a file named \fBmain.tcl\fR is located in the root directory of that file system (i.e., at \fIZIPFS_VOLUME\fB/app/main.tcl\fR after the ZIP archive is mounted as described above) it is treated as the startup script for the process. .IP [3] If the file \fIZIPFS_VOLUME\fB/app/tcl_library/init.tcl\fR is present, the \fBtcl_library\fR global variable in the initial Tcl interpreter is set to \fIZIPFS_VOLUME\fB/app/tcl_library\fR. .IP [4] If the directory \fBtcl_library\fR was not found in the main application mount, the system will then search for it as either a VFS attached to the application dynamic library, or as a zip archive named \fBlibtcl_\fImajor\fB_\fIminor\fB_\fIpatchlevel\fB.zip\fR either in the present working directory or in the standard Tcl install location. (For example, the Tcl 8.7.2 release would be searched for in a file \fBlibtcl_8_7_2.zip\fR.) That archive, if located, is also mounted read-only. .PP On Windows, \fBTclZipfs_AppHook\fR has a slightly different signature, since it uses WCHAR instead of char. As a result, it requires the application to be compiled with the UNICODE preprocessor symbol defined (e.g., via the \fB\-DUNICODE\fR compiler flag). .PP The result of \fBTclZipfs_AppHook\fR is the full Tcl version with build information (e.g., \fB9.0.0+abcdef...abcdef.gcc-1002\fR). The function \fImay\fR modify the variables pointed to by \fIargcPtr\fR and \fIargvPtr\fR to remove arguments; the current implementation does not do so, but callers \fIshould not\fR assume that this will be true in the future. .PP \fBTclZipfs_Mount\fR is used to mount ZIP archives and to retrieve information about currently mounted archives. If \fImountpoint\fR and \fIzipname\fR are both specified (i.e. non-NULL), the function mounts the ZIP archive \fIzipname\fR on the mount point given in \fImountpoint\fR. If \fIpassword\fR is not NULL, it should point to the NUL terminated password protecting the archive. If not under the zipfs file system root, \fImountpoint\fR is normalized with respect to it. For example, a mount point passed as either \fBmt\fR or \fB/mt\fR would be normalized to \fB//zipfs:/mt\fR, given that \fIZIPFS_VOLUME\fR as returned by \fBzipfs root\fR is .QW //zipfs:/ . An error is raised if the mount point includes a drive or UNC volume. On success, \fIinterp\fR's result is set to the normalized mount point path. .PP If \fImountpoint\fR is a NULL pointer, information on all currently mounted ZIP file systems is stored in \fIinterp\fR's result as a sequence of mount points and ZIP file names. .PP |
︙ | ︙ |
Changes to doc/zipfs.n.
︙ | ︙ | |||
10 11 12 13 14 15 16 | .so man.macros .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME zipfs \- Mount and work with ZIP files within Tcl .SH SYNOPSIS .nf | < < | > < < | 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | .so man.macros .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME zipfs \- Mount and work with ZIP files within Tcl .SH SYNOPSIS .nf \fBzipfs canonical\fR ?\fImountpoint\fR? \fIfilename\fR ?\fIZIPFS\fR? \fBzipfs exists\fI filename\fR \fBzipfs find\fI directoryName\fR \fBzipfs info\fI filename\fR \fBzipfs list\fR ?(\fB\-glob\fR|\fB\-regexp\fR)? ?\fIpattern\fR? \fBzipfs lmkimg\fI outfile inlist\fR ?\fIpassword\fR? ?\fIinfile\fR? \fBzipfs lmkzip\fI outfile inlist\fR ?\fIpassword\fR? \fBzipfs mkimg\fI outfile indir\fR ?\fIstrip\fR? ?\fIpassword\fR? ?\fIinfile\fR? \fBzipfs mkkey\fI password\fR \fBzipfs mkzip\fI outfile indir\fR ?\fIstrip\fR? ?\fIpassword\fR? \fBzipfs mount\fR ?\fIzipfile\fR? ?\fImountpoint\fR? ?\fIpassword\fR? \fBzipfs mountdata\fR \fIdata\fR \fImountpoint\fR \fBzipfs root\fR \fBzipfs unmount\fI mountpoint\fR .fi .BE .SH DESCRIPTION .PP The \fBzipfs\fR command provides Tcl with the ability to mount the contents of a ZIP archive file as a virtual file system. Tcl's ZIP archive support is limited to basic features and options. Supported storage methods include only STORE and DEFLATE with optional |
︙ | ︙ | |||
128 129 130 131 132 133 134 | virtual filesystem at \fImountpoint\fR. After this command executes, files contained in \fIzipfile\fR will appear to Tcl to be regular files at the mount point. If \fImountpoint\fR is specified as an empty string, it is defaulted to the \fB[zipfs root]\fR. The command returns the normalized mount point path. .PP If not under the zipfs file system root, \fImountpoint\fR is normalized with | | | > > | > > > > > | < < | | | > | > | | 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 | virtual filesystem at \fImountpoint\fR. After this command executes, files contained in \fIzipfile\fR will appear to Tcl to be regular files at the mount point. If \fImountpoint\fR is specified as an empty string, it is defaulted to the \fB[zipfs root]\fR. The command returns the normalized mount point path. .PP If not under the zipfs file system root, \fImountpoint\fR is normalized with respect to it. For example, a mount point passed as either \fBmt\fR or \fB/mt\fR would be normalized to \fB//zipfs:/mt\fR (given that \fBzipfs root\fR returns .QW //zipfs:/ ). An error is raised if the mount point includes a drive or UNC volume. .PP \fBNB:\fR because the current working directory is a concept maintained by the operating system, using \fBcd\fR into a mounted archive will only work in the current process, and then not entirely consistently (e.g., if a shared library uses direct access to the OS rather than through Tcl's filesystem API, it will not see the current directory as being inside the mount and will not be able to access the files inside the mount). .RE .\" METHOD: mountdata .TP \fBzipfs mountdata\fR \fIdata\fR \fImountpoint\fR Mounts the ZIP archive content \fIdata\fR as a Tcl virtual filesystem at \fImountpoint\fR. .\" METHOD: root .TP \fBzipfs root\fR . Returns a constant string which indicates the mount point for zipfs volumes for the current platform. User should not rely on the mount point being the same constant string for all platforms. .\" METHOD: unmount .TP \fBzipfs unmount \fImountpoint\fR . Unmounts a previously mounted ZIP archive mounted to \fImountpoint\fR. The command will fail with an error exception if there are any files within the mounted archive are open. .SS "ZIP CREATION COMMANDS" This package also provides several commands to aid the creation of ZIP archives as Tcl applications. .\" METHOD: mkzip .TP \fBzipfs mkzip\fI outfile indir\fR ?\fIstrip\fR? ?\fIpassword\fR? . Creates a ZIP archive file named \fIoutfile\fR from the contents of the input directory \fIindir\fR (contained regular files only) with optional ZIP password \fIpassword\fR. While processing the files below \fIindir\fR the optional file name prefix given in \fIstrip\fR is stripped off the beginning of the respective file name if non-empty. When stripping, it is common to remove either the whole source directory name or the name of its parent directory. .RS .PP \fBCaution:\fR the choice of the \fIindir\fR parameter (less the optional stripped prefix) determines the later root name of the archive's content. .RE .\" METHOD: mkimg .TP \fBzipfs mkimg\fI outfile indir\fR ?\fIstrip\fR? ?\fIpassword\fR? ?\fIinfile\fR? . Creates an image (potentially a new executable file) similar to \fBzipfs mkzip\fR; see that command for a description of most parameters to this command, as they behave identically here. If \fIoutfile\fR exists, it will be silently overwritten. .RS .PP If the \fIinfile\fR parameter is specified, this file is prepended in front of the ZIP archive, otherwise the file returned by \fBinfo nameofexecutable\fR (i.e., the executable file of the running process, typically \fBwish\fR or \fBtclsh\fR) is used. If the \fIpassword\fR parameter is not the empty string, an obfuscated version of that password (see \fBzipfs mkkey\fR) is placed between the image and ZIP chunks of the output file and the contents of the ZIP chunk are protected with that password. If the starting image has a ZIP archive already attached to it, it is removed from the copy in \fIoutfile\fR before the new ZIP archive is added. .PP If there is a file, \fBmain.tcl\fR, in the root directory of the resulting |
︙ | ︙ | |||
210 211 212 213 214 215 216 | library, respectively. With a static binding, the Tcl_Library contents, etc., are attached to the application, \fBtclsh\fR or \fBwish\fR. When using \fBmkimg\fR with a statically built tclsh, it is the user's responsibility to preserve the attached archive by first extracting it to a temporary location, and then add whatever additional files desired, before creating and attaching the new archive to the new application. | < < < | > > > > > | 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 | library, respectively. With a static binding, the Tcl_Library contents, etc., are attached to the application, \fBtclsh\fR or \fBwish\fR. When using \fBmkimg\fR with a statically built tclsh, it is the user's responsibility to preserve the attached archive by first extracting it to a temporary location, and then add whatever additional files desired, before creating and attaching the new archive to the new application. .RE .\" METHOD: mkkey .TP \fBzipfs mkkey\fI password\fR . Given the clear text \fIpassword\fR argument, an obfuscated string version is returned with the same format used in the \fBzipfs mkimg\fR command. .\" METHOD: lmkimg .TP \fBzipfs lmkimg\fI outfile inlist\fR ?\fIpassword\fR? ?\fIinfile\fR? . This command is like \fBzipfs mkimg\fR, but instead of an input directory, \fIinlist\fR must be a Tcl list where the odd elements are the names of files to be copied into the archive in the image, and the even elements are their respective names within that archive. .\" METHOD: lmkzip .TP \fBzipfs lmkzip\fI outfile inlist\fR ?\fIpassword\fR? . This command is like \fBzipfs mkzip\fR, but instead of an input directory, \fIinlist\fR must be a Tcl list where the odd elements are the names of files to be copied into the archive, and the even elements are their respective names within that archive. .SH "NOTE" .PP The current syntax for certain subcommands using multiple optional parameters might change in the future to support an \fI?-option value?\fR pattern instead. Therfore, the current syntax should not be considered stable. .SH "EXAMPLES" .PP Mounting an ZIP archive as an application directory and running code out of it before unmounting it again: .PP .CS set zip myApp.zip |
︙ | ︙ | |||
281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 | # Create with password \fBzipfs mkzip\fR $targetZip $sourceDir $sourceDir $password # Mount with password \fBzipfs mount\fR $zip $base $password .CE .PP When creating an executable image with a password, the password is placed within the executable in a shrouded form so that the application can read files inside the embedded ZIP archive yet casual inspection cannot read it. .PP .CS set appDir [file normalize myApp] set img "myApp.bin" set password "hunter2" # Create some simple content to define a basic application file mkdir $appDir | > > > > | | > > > > | | 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 | # Create with password \fBzipfs mkzip\fR $targetZip $sourceDir $sourceDir $password # Mount with password \fBzipfs mount\fR $zip $base $password .CE .PP The following example creates an executable application by appending a ZIP archive to the tclsh file it was called from and storing the resulting executable in the file .QW myApp.bin . When creating an executable image with a password, the password is placed within the executable in a shrouded form so that the application can read files inside the embedded ZIP archive yet casual inspection cannot read it. .PP .CS set appDir [file normalize myApp] set img "myApp.bin" set password "hunter2" # Create some simple content to define a basic application file mkdir $appDir set f [open $appDir/main.tcl w] puts $f { puts "Hi. This is [info script]" } close $f # Create the executable application \fBzipfs mkimg\fR $img $appDir $appDir $password # remove the now obsolete temporary appDir folder file delete -force $appDir # Launch the executable, printing its output to stdout exec $img >@stdout # prints the following line assuming [zipfs root] returns "//zipfs:/": # \fIHi. This is //zipfs:/app/main.tcl\fR .CE .SH "SEE ALSO" tclsh(1), file(n), zipfs(3), zlib(n) .SH "KEYWORDS" compress, filesystem, zip '\" Local Variables: '\" mode: nroff '\" End: |
Changes to generic/regc_locale.c.
︙ | ︙ | |||
165 166 167 168 169 170 171 | {0x1401, 0x166C}, {0x166F, 0x167F}, {0x1681, 0x169A}, {0x16A0, 0x16EA}, {0x16F1, 0x16F8}, {0x1700, 0x1711}, {0x171F, 0x1731}, {0x1740, 0x1751}, {0x1760, 0x176C}, {0x176E, 0x1770}, {0x1780, 0x17B3}, {0x1820, 0x1878}, {0x1880, 0x1884}, {0x1887, 0x18A8}, {0x18B0, 0x18F5}, {0x1900, 0x191E}, {0x1950, 0x196D}, {0x1970, 0x1974}, {0x1980, 0x19AB}, {0x19B0, 0x19C9}, {0x1A00, 0x1A16}, {0x1A20, 0x1A54}, {0x1B05, 0x1B33}, {0x1B45, 0x1B4C}, {0x1B83, 0x1BA0}, {0x1BBA, 0x1BE5}, {0x1C00, 0x1C23}, {0x1C4D, 0x1C4F}, | | | | 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 | {0x1401, 0x166C}, {0x166F, 0x167F}, {0x1681, 0x169A}, {0x16A0, 0x16EA}, {0x16F1, 0x16F8}, {0x1700, 0x1711}, {0x171F, 0x1731}, {0x1740, 0x1751}, {0x1760, 0x176C}, {0x176E, 0x1770}, {0x1780, 0x17B3}, {0x1820, 0x1878}, {0x1880, 0x1884}, {0x1887, 0x18A8}, {0x18B0, 0x18F5}, {0x1900, 0x191E}, {0x1950, 0x196D}, {0x1970, 0x1974}, {0x1980, 0x19AB}, {0x19B0, 0x19C9}, {0x1A00, 0x1A16}, {0x1A20, 0x1A54}, {0x1B05, 0x1B33}, {0x1B45, 0x1B4C}, {0x1B83, 0x1BA0}, {0x1BBA, 0x1BE5}, {0x1C00, 0x1C23}, {0x1C4D, 0x1C4F}, {0x1C5A, 0x1C7D}, {0x1C80, 0x1C8A}, {0x1C90, 0x1CBA}, {0x1CBD, 0x1CBF}, {0x1CE9, 0x1CEC}, {0x1CEE, 0x1CF3}, {0x1D00, 0x1DBF}, {0x1E00, 0x1F15}, {0x1F18, 0x1F1D}, {0x1F20, 0x1F45}, {0x1F48, 0x1F4D}, {0x1F50, 0x1F57}, {0x1F5F, 0x1F7D}, {0x1F80, 0x1FB4}, {0x1FB6, 0x1FBC}, {0x1FC2, 0x1FC4}, {0x1FC6, 0x1FCC}, {0x1FD0, 0x1FD3}, {0x1FD6, 0x1FDB}, {0x1FE0, 0x1FEC}, {0x1FF2, 0x1FF4}, {0x1FF6, 0x1FFC}, {0x2090, 0x209C}, {0x210A, 0x2113}, {0x2119, 0x211D}, {0x212A, 0x212D}, {0x212F, 0x2139}, {0x213C, 0x213F}, {0x2145, 0x2149}, {0x2C00, 0x2CE4}, {0x2CEB, 0x2CEE}, {0x2D00, 0x2D25}, {0x2D30, 0x2D67}, {0x2D80, 0x2D96}, {0x2DA0, 0x2DA6}, {0x2DA8, 0x2DAE}, {0x2DB0, 0x2DB6}, {0x2DB8, 0x2DBE}, {0x2DC0, 0x2DC6}, {0x2DC8, 0x2DCE}, {0x2DD0, 0x2DD6}, {0x2DD8, 0x2DDE}, {0x3031, 0x3035}, {0x3041, 0x3096}, {0x309D, 0x309F}, {0x30A1, 0x30FA}, {0x30FC, 0x30FF}, {0x3105, 0x312F}, {0x3131, 0x318E}, {0x31A0, 0x31BF}, {0x31F0, 0x31FF}, {0x3400, 0x4DBF}, {0x4E00, 0xA48C}, {0xA4D0, 0xA4FD}, {0xA500, 0xA60C}, {0xA610, 0xA61F}, {0xA640, 0xA66E}, {0xA67F, 0xA69D}, {0xA6A0, 0xA6E5}, {0xA717, 0xA71F}, {0xA722, 0xA788}, {0xA78B, 0xA7CD}, {0xA7D5, 0xA7DC}, {0xA7F2, 0xA801}, {0xA803, 0xA805}, {0xA807, 0xA80A}, {0xA80C, 0xA822}, {0xA840, 0xA873}, {0xA882, 0xA8B3}, {0xA8F2, 0xA8F7}, {0xA90A, 0xA925}, {0xA930, 0xA946}, {0xA960, 0xA97C}, {0xA984, 0xA9B2}, {0xA9E0, 0xA9E4}, {0xA9E6, 0xA9EF}, {0xA9FA, 0xA9FE}, {0xAA00, 0xAA28}, {0xAA40, 0xAA42}, {0xAA44, 0xAA4B}, {0xAA60, 0xAA76}, {0xAA7E, 0xAAAF}, {0xAAB9, 0xAABD}, {0xAADB, 0xAADD}, {0xAAE0, 0xAAEA}, {0xAAF2, 0xAAF4}, {0xAB01, 0xAB06}, {0xAB09, 0xAB0E}, {0xAB11, 0xAB16}, {0xAB20, 0xAB26}, {0xAB28, 0xAB2E}, {0xAB30, 0xAB5A}, |
︙ | ︙ | |||
202 203 204 205 206 207 208 | #if CHRBITS > 16 ,{0x10000, 0x1000B}, {0x1000D, 0x10026}, {0x10028, 0x1003A}, {0x1003F, 0x1004D}, {0x10050, 0x1005D}, {0x10080, 0x100FA}, {0x10280, 0x1029C}, {0x102A0, 0x102D0}, {0x10300, 0x1031F}, {0x1032D, 0x10340}, {0x10342, 0x10349}, {0x10350, 0x10375}, {0x10380, 0x1039D}, {0x103A0, 0x103C3}, {0x103C8, 0x103CF}, {0x10400, 0x1049D}, {0x104B0, 0x104D3}, {0x104D8, 0x104FB}, {0x10500, 0x10527}, {0x10530, 0x10563}, {0x10570, 0x1057A}, {0x1057C, 0x1058A}, {0x1058C, 0x10592}, {0x10597, 0x105A1}, | | | | | | | | | > | > | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 | #if CHRBITS > 16 ,{0x10000, 0x1000B}, {0x1000D, 0x10026}, {0x10028, 0x1003A}, {0x1003F, 0x1004D}, {0x10050, 0x1005D}, {0x10080, 0x100FA}, {0x10280, 0x1029C}, {0x102A0, 0x102D0}, {0x10300, 0x1031F}, {0x1032D, 0x10340}, {0x10342, 0x10349}, {0x10350, 0x10375}, {0x10380, 0x1039D}, {0x103A0, 0x103C3}, {0x103C8, 0x103CF}, {0x10400, 0x1049D}, {0x104B0, 0x104D3}, {0x104D8, 0x104FB}, {0x10500, 0x10527}, {0x10530, 0x10563}, {0x10570, 0x1057A}, {0x1057C, 0x1058A}, {0x1058C, 0x10592}, {0x10597, 0x105A1}, {0x105A3, 0x105B1}, {0x105B3, 0x105B9}, {0x105C0, 0x105F3}, {0x10600, 0x10736}, {0x10740, 0x10755}, {0x10760, 0x10767}, {0x10780, 0x10785}, {0x10787, 0x107B0}, {0x107B2, 0x107BA}, {0x10800, 0x10805}, {0x1080A, 0x10835}, {0x1083F, 0x10855}, {0x10860, 0x10876}, {0x10880, 0x1089E}, {0x108E0, 0x108F2}, {0x10900, 0x10915}, {0x10920, 0x10939}, {0x10980, 0x109B7}, {0x10A10, 0x10A13}, {0x10A15, 0x10A17}, {0x10A19, 0x10A35}, {0x10A60, 0x10A7C}, {0x10A80, 0x10A9C}, {0x10AC0, 0x10AC7}, {0x10AC9, 0x10AE4}, {0x10B00, 0x10B35}, {0x10B40, 0x10B55}, {0x10B60, 0x10B72}, {0x10B80, 0x10B91}, {0x10C00, 0x10C48}, {0x10C80, 0x10CB2}, {0x10CC0, 0x10CF2}, {0x10D00, 0x10D23}, {0x10D4A, 0x10D65}, {0x10D6F, 0x10D85}, {0x10E80, 0x10EA9}, {0x10EC2, 0x10EC4}, {0x10F00, 0x10F1C}, {0x10F30, 0x10F45}, {0x10F70, 0x10F81}, {0x10FB0, 0x10FC4}, {0x10FE0, 0x10FF6}, {0x11003, 0x11037}, {0x11083, 0x110AF}, {0x110D0, 0x110E8}, {0x11103, 0x11126}, {0x11150, 0x11172}, {0x11183, 0x111B2}, {0x111C1, 0x111C4}, {0x11200, 0x11211}, {0x11213, 0x1122B}, {0x11280, 0x11286}, {0x1128A, 0x1128D}, {0x1128F, 0x1129D}, {0x1129F, 0x112A8}, {0x112B0, 0x112DE}, {0x11305, 0x1130C}, {0x11313, 0x11328}, {0x1132A, 0x11330}, {0x11335, 0x11339}, {0x1135D, 0x11361}, {0x11380, 0x11389}, {0x11390, 0x113B5}, {0x11400, 0x11434}, {0x11447, 0x1144A}, {0x1145F, 0x11461}, {0x11480, 0x114AF}, {0x11580, 0x115AE}, {0x115D8, 0x115DB}, {0x11600, 0x1162F}, {0x11680, 0x116AA}, {0x11700, 0x1171A}, {0x11740, 0x11746}, {0x11800, 0x1182B}, {0x118A0, 0x118DF}, {0x118FF, 0x11906}, {0x1190C, 0x11913}, {0x11918, 0x1192F}, {0x119A0, 0x119A7}, {0x119AA, 0x119D0}, {0x11A0B, 0x11A32}, {0x11A5C, 0x11A89}, {0x11AB0, 0x11AF8}, {0x11BC0, 0x11BE0}, {0x11C00, 0x11C08}, {0x11C0A, 0x11C2E}, {0x11C72, 0x11C8F}, {0x11D00, 0x11D06}, {0x11D0B, 0x11D30}, {0x11D60, 0x11D65}, {0x11D6A, 0x11D89}, {0x11EE0, 0x11EF2}, {0x11F04, 0x11F10}, {0x11F12, 0x11F33}, {0x12000, 0x12399}, {0x12480, 0x12543}, {0x12F90, 0x12FF0}, {0x13000, 0x1342F}, {0x13441, 0x13446}, {0x13460, 0x143FA}, {0x14400, 0x14646}, {0x16100, 0x1611D}, {0x16800, 0x16A38}, {0x16A40, 0x16A5E}, {0x16A70, 0x16ABE}, {0x16AD0, 0x16AED}, {0x16B00, 0x16B2F}, {0x16B40, 0x16B43}, {0x16B63, 0x16B77}, {0x16B7D, 0x16B8F}, {0x16D40, 0x16D6C}, {0x16E40, 0x16E7F}, {0x16F00, 0x16F4A}, {0x16F93, 0x16F9F}, {0x17000, 0x187F7}, {0x18800, 0x18CD5}, {0x18CFF, 0x18D08}, {0x1AFF0, 0x1AFF3}, {0x1AFF5, 0x1AFFB}, {0x1B000, 0x1B122}, {0x1B150, 0x1B152}, {0x1B164, 0x1B167}, {0x1B170, 0x1B2FB}, {0x1BC00, 0x1BC6A}, {0x1BC70, 0x1BC7C}, {0x1BC80, 0x1BC88}, {0x1BC90, 0x1BC99}, {0x1D400, 0x1D454}, {0x1D456, 0x1D49C}, {0x1D4A9, 0x1D4AC}, {0x1D4AE, 0x1D4B9}, {0x1D4BD, 0x1D4C3}, {0x1D4C5, 0x1D505}, {0x1D507, 0x1D50A}, {0x1D50D, 0x1D514}, {0x1D516, 0x1D51C}, {0x1D51E, 0x1D539}, {0x1D53B, 0x1D53E}, {0x1D540, 0x1D544}, {0x1D54A, 0x1D550}, {0x1D552, 0x1D6A5}, {0x1D6A8, 0x1D6C0}, {0x1D6C2, 0x1D6DA}, {0x1D6DC, 0x1D6FA}, {0x1D6FC, 0x1D714}, {0x1D716, 0x1D734}, {0x1D736, 0x1D74E}, {0x1D750, 0x1D76E}, {0x1D770, 0x1D788}, {0x1D78A, 0x1D7A8}, {0x1D7AA, 0x1D7C2}, {0x1D7C4, 0x1D7CB}, {0x1DF00, 0x1DF1E}, {0x1DF25, 0x1DF2A}, {0x1E030, 0x1E06D}, {0x1E100, 0x1E12C}, {0x1E137, 0x1E13D}, {0x1E290, 0x1E2AD}, {0x1E2C0, 0x1E2EB}, {0x1E4D0, 0x1E4EB}, {0x1E5D0, 0x1E5ED}, {0x1E7E0, 0x1E7E6}, {0x1E7E8, 0x1E7EB}, {0x1E7F0, 0x1E7FE}, {0x1E800, 0x1E8C4}, {0x1E900, 0x1E943}, {0x1EE00, 0x1EE03}, {0x1EE05, 0x1EE1F}, {0x1EE29, 0x1EE32}, {0x1EE34, 0x1EE37}, {0x1EE4D, 0x1EE4F}, {0x1EE67, 0x1EE6A}, {0x1EE6C, 0x1EE72}, {0x1EE74, 0x1EE77}, {0x1EE79, 0x1EE7C}, {0x1EE80, 0x1EE89}, {0x1EE8B, 0x1EE9B}, {0x1EEA1, 0x1EEA3}, {0x1EEA5, 0x1EEA9}, {0x1EEAB, 0x1EEBB}, {0x20000, 0x2A6DF}, {0x2A700, 0x2B739}, {0x2B740, 0x2B81D}, {0x2B820, 0x2CEA1}, {0x2CEB0, 0x2EBE0}, {0x2EBF0, 0x2EE5D}, {0x2F800, 0x2FA1D}, {0x30000, 0x3134A}, {0x31350, 0x323AF} #endif }; #define NUM_ALPHA_RANGE ((int)(sizeof(alphaRangeTable)/sizeof(crange))) static const chr alphaCharTable[] = { 0xAA, 0xB5, 0xBA, 0x2EC, 0x2EE, 0x376, 0x377, 0x37F, 0x386, |
︙ | ︙ | |||
275 276 277 278 279 280 281 | 0x2D6F, 0x2E2F, 0x3005, 0x3006, 0x303B, 0x303C, 0xA62A, 0xA62B, 0xA7D0, 0xA7D1, 0xA7D3, 0xA8FB, 0xA8FD, 0xA8FE, 0xA9CF, 0xAA7A, 0xAAB1, 0xAAB5, 0xAAB6, 0xAAC0, 0xAAC2, 0xFB1D, 0xFB3E, 0xFB40, 0xFB41, 0xFB43, 0xFB44 #if CHRBITS > 16 ,0x1003C, 0x1003D, 0x10594, 0x10595, 0x105BB, 0x105BC, 0x10808, 0x10837, 0x10838, 0x1083C, 0x108F4, 0x108F5, 0x109BE, 0x109BF, 0x10A00, 0x10EB0, 0x10EB1, 0x10F27, 0x11071, 0x11072, 0x11075, 0x11144, 0x11147, 0x11176, 0x111DA, 0x111DC, 0x1123F, | | > | | | | | | | < | 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 | 0x2D6F, 0x2E2F, 0x3005, 0x3006, 0x303B, 0x303C, 0xA62A, 0xA62B, 0xA7D0, 0xA7D1, 0xA7D3, 0xA8FB, 0xA8FD, 0xA8FE, 0xA9CF, 0xAA7A, 0xAAB1, 0xAAB5, 0xAAB6, 0xAAC0, 0xAAC2, 0xFB1D, 0xFB3E, 0xFB40, 0xFB41, 0xFB43, 0xFB44 #if CHRBITS > 16 ,0x1003C, 0x1003D, 0x10594, 0x10595, 0x105BB, 0x105BC, 0x10808, 0x10837, 0x10838, 0x1083C, 0x108F4, 0x108F5, 0x109BE, 0x109BF, 0x10A00, 0x10EB0, 0x10EB1, 0x10F27, 0x11071, 0x11072, 0x11075, 0x11144, 0x11147, 0x11176, 0x111DA, 0x111DC, 0x1123F, 0x11240, 0x11288, 0x1130F, 0x11310, 0x11332, 0x11333, 0x1133D, 0x11350, 0x1138B, 0x1138E, 0x113B7, 0x113D1, 0x113D3, 0x114C4, 0x114C5, 0x114C7, 0x11644, 0x116B8, 0x11909, 0x11915, 0x11916, 0x1193F, 0x11941, 0x119E1, 0x119E3, 0x11A00, 0x11A3A, 0x11A50, 0x11A9D, 0x11C40, 0x11D08, 0x11D09, 0x11D46, 0x11D67, 0x11D68, 0x11D98, 0x11F02, 0x11FB0, 0x16F50, 0x16FE0, 0x16FE1, 0x16FE3, 0x1AFFD, 0x1AFFE, 0x1B132, 0x1B155, 0x1D49E, 0x1D49F, 0x1D4A2, 0x1D4A5, 0x1D4A6, 0x1D4BB, 0x1D546, 0x1E14E, 0x1E5F0, 0x1E7ED, 0x1E7EE, 0x1E94B, 0x1EE21, 0x1EE22, 0x1EE24, 0x1EE27, 0x1EE39, 0x1EE3B, 0x1EE42, 0x1EE47, 0x1EE49, 0x1EE4B, 0x1EE51, 0x1EE52, 0x1EE54, 0x1EE57, 0x1EE59, 0x1EE5B, 0x1EE5D, 0x1EE5F, 0x1EE61, 0x1EE62, 0x1EE64, 0x1EE7E #endif }; #define NUM_ALPHA_CHAR ((int)(sizeof(alphaCharTable)/sizeof(chr))) /* * Unicode: control characters. |
︙ | ︙ | |||
328 329 330 331 332 333 334 | {0xF20, 0xF29}, {0x1040, 0x1049}, {0x1090, 0x1099}, {0x17E0, 0x17E9}, {0x1810, 0x1819}, {0x1946, 0x194F}, {0x19D0, 0x19D9}, {0x1A80, 0x1A89}, {0x1A90, 0x1A99}, {0x1B50, 0x1B59}, {0x1BB0, 0x1BB9}, {0x1C40, 0x1C49}, {0x1C50, 0x1C59}, {0xA620, 0xA629}, {0xA8D0, 0xA8D9}, {0xA900, 0xA909}, {0xA9D0, 0xA9D9}, {0xA9F0, 0xA9F9}, {0xAA50, 0xAA59}, {0xABF0, 0xABF9}, {0xFF10, 0xFF19} #if CHRBITS > 16 | | | | > | | > | | | | | | | | | | | | | | | | > | | < | 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 | {0xF20, 0xF29}, {0x1040, 0x1049}, {0x1090, 0x1099}, {0x17E0, 0x17E9}, {0x1810, 0x1819}, {0x1946, 0x194F}, {0x19D0, 0x19D9}, {0x1A80, 0x1A89}, {0x1A90, 0x1A99}, {0x1B50, 0x1B59}, {0x1BB0, 0x1BB9}, {0x1C40, 0x1C49}, {0x1C50, 0x1C59}, {0xA620, 0xA629}, {0xA8D0, 0xA8D9}, {0xA900, 0xA909}, {0xA9D0, 0xA9D9}, {0xA9F0, 0xA9F9}, {0xAA50, 0xAA59}, {0xABF0, 0xABF9}, {0xFF10, 0xFF19} #if CHRBITS > 16 ,{0x104A0, 0x104A9}, {0x10D30, 0x10D39}, {0x10D40, 0x10D49}, {0x11066, 0x1106F}, {0x110F0, 0x110F9}, {0x11136, 0x1113F}, {0x111D0, 0x111D9}, {0x112F0, 0x112F9}, {0x11450, 0x11459}, {0x114D0, 0x114D9}, {0x11650, 0x11659}, {0x116C0, 0x116C9}, {0x116D0, 0x116E3}, {0x11730, 0x11739}, {0x118E0, 0x118E9}, {0x11950, 0x11959}, {0x11BF0, 0x11BF9}, {0x11C50, 0x11C59}, {0x11D50, 0x11D59}, {0x11DA0, 0x11DA9}, {0x11F50, 0x11F59}, {0x16130, 0x16139}, {0x16A60, 0x16A69}, {0x16AC0, 0x16AC9}, {0x16B50, 0x16B59}, {0x16D70, 0x16D79}, {0x1CCF0, 0x1CCF9}, {0x1D7CE, 0x1D7FF}, {0x1E140, 0x1E149}, {0x1E2F0, 0x1E2F9}, {0x1E4F0, 0x1E4F9}, {0x1E5F1, 0x1E5FA}, {0x1E950, 0x1E959}, {0x1FBF0, 0x1FBF9} #endif }; #define NUM_DIGIT_RANGE ((int)(sizeof(digitRangeTable)/sizeof(crange))) /* * no singletons of digit characters. */ /* * Unicode: punctuation characters. */ static const crange punctRangeTable[] = { {0x21, 0x23}, {0x25, 0x2A}, {0x2C, 0x2F}, {0x5B, 0x5D}, {0x55A, 0x55F}, {0x61D, 0x61F}, {0x66A, 0x66D}, {0x700, 0x70D}, {0x7F7, 0x7F9}, {0x830, 0x83E}, {0xF04, 0xF12}, {0xF3A, 0xF3D}, {0xFD0, 0xFD4}, {0x104A, 0x104F}, {0x1360, 0x1368}, {0x16EB, 0x16ED}, {0x17D4, 0x17D6}, {0x17D8, 0x17DA}, {0x1800, 0x180A}, {0x1AA0, 0x1AA6}, {0x1AA8, 0x1AAD}, {0x1B5A, 0x1B60}, {0x1B7D, 0x1B7F}, {0x1BFC, 0x1BFF}, {0x1C3B, 0x1C3F}, {0x1CC0, 0x1CC7}, {0x2010, 0x2027}, {0x2030, 0x2043}, {0x2045, 0x2051}, {0x2053, 0x205E}, {0x2308, 0x230B}, {0x2768, 0x2775}, {0x27E6, 0x27EF}, {0x2983, 0x2998}, {0x29D8, 0x29DB}, {0x2CF9, 0x2CFC}, {0x2E00, 0x2E2E}, {0x2E30, 0x2E4F}, {0x2E52, 0x2E5D}, {0x3001, 0x3003}, {0x3008, 0x3011}, {0x3014, 0x301F}, {0xA60D, 0xA60F}, {0xA6F2, 0xA6F7}, {0xA874, 0xA877}, {0xA8F8, 0xA8FA}, {0xA9C1, 0xA9CD}, {0xAA5C, 0xAA5F}, {0xFE10, 0xFE19}, {0xFE30, 0xFE52}, {0xFE54, 0xFE61}, {0xFF01, 0xFF03}, {0xFF05, 0xFF0A}, {0xFF0C, 0xFF0F}, {0xFF3B, 0xFF3D}, {0xFF5F, 0xFF65} #if CHRBITS > 16 ,{0x10100, 0x10102}, {0x10A50, 0x10A58}, {0x10AF0, 0x10AF6}, {0x10B39, 0x10B3F}, {0x10B99, 0x10B9C}, {0x10F55, 0x10F59}, {0x10F86, 0x10F89}, {0x11047, 0x1104D}, {0x110BE, 0x110C1}, {0x11140, 0x11143}, {0x111C5, 0x111C8}, {0x111DD, 0x111DF}, {0x11238, 0x1123D}, {0x1144B, 0x1144F}, {0x115C1, 0x115D7}, {0x11641, 0x11643}, {0x11660, 0x1166C}, {0x1173C, 0x1173E}, {0x11944, 0x11946}, {0x11A3F, 0x11A46}, {0x11A9A, 0x11A9C}, {0x11A9E, 0x11AA2}, {0x11B00, 0x11B09}, {0x11C41, 0x11C45}, {0x11F43, 0x11F4F}, {0x12470, 0x12474}, {0x16B37, 0x16B3B}, {0x16D6D, 0x16D6F}, {0x16E97, 0x16E9A}, {0x1DA87, 0x1DA8B} #endif }; #define NUM_PUNCT_RANGE ((int)(sizeof(punctRangeTable)/sizeof(crange))) static const chr punctCharTable[] = { 0x3A, 0x3B, 0x3F, 0x40, 0x5F, 0x7B, 0x7D, 0xA1, 0xA7, 0xAB, 0xB6, 0xB7, 0xBB, 0xBF, 0x37E, 0x387, 0x589, 0x58A, 0x5BE, 0x5C0, 0x5C3, 0x5C6, 0x5F3, 0x5F4, 0x609, 0x60A, 0x60C, 0x60D, 0x61B, 0x6D4, 0x85E, 0x964, 0x965, 0x970, 0x9FD, 0xA76, 0xAF0, 0xC77, 0xC84, 0xDF4, 0xE4F, 0xE5A, 0xE5B, 0xF14, 0xF85, 0xFD9, 0xFDA, 0x10FB, 0x1400, 0x166E, 0x169B, 0x169C, 0x1735, 0x1736, 0x1944, 0x1945, 0x1A1E, 0x1A1F, 0x1B4E, 0x1B4F, 0x1C7E, 0x1C7F, 0x1CD3, 0x207D, 0x207E, 0x208D, 0x208E, 0x2329, 0x232A, 0x27C5, 0x27C6, 0x29FC, 0x29FD, 0x2CFE, 0x2CFF, 0x2D70, 0x3030, 0x303D, 0x30A0, 0x30FB, 0xA4FE, 0xA4FF, 0xA673, 0xA67E, 0xA8CE, 0xA8CF, 0xA8FC, 0xA92E, 0xA92F, 0xA95F, 0xA9DE, 0xA9DF, 0xAADE, 0xAADF, 0xAAF0, 0xAAF1, 0xABEB, 0xFD3E, 0xFD3F, 0xFE63, 0xFE68, 0xFE6A, 0xFE6B, 0xFF1A, 0xFF1B, 0xFF1F, 0xFF20, 0xFF3F, 0xFF5B, 0xFF5D #if CHRBITS > 16 ,0x1039F, 0x103D0, 0x1056F, 0x10857, 0x1091F, 0x1093F, 0x10A7F, 0x10D6E, 0x10EAD, 0x110BB, 0x110BC, 0x11174, 0x11175, 0x111CD, 0x111DB, 0x112A9, 0x113D4, 0x113D5, 0x113D7, 0x113D8, 0x1145A, 0x1145B, 0x1145D, 0x114C6, 0x116B9, 0x1183B, 0x119E2, 0x11BE1, 0x11C70, 0x11C71, 0x11EF7, 0x11EF8, 0x11FFF, 0x12FF1, 0x12FF2, 0x16A6E, 0x16A6F, 0x16AF5, 0x16B44, 0x16FE2, 0x1BC9F, 0x1E5FF, 0x1E95E, 0x1E95F #endif }; #define NUM_PUNCT_CHAR ((int)(sizeof(punctCharTable)/sizeof(chr))) /* * Unicode: white space characters. |
︙ | ︙ | |||
439 440 441 442 443 444 445 | {0x1F90, 0x1F97}, {0x1FA0, 0x1FA7}, {0x1FB0, 0x1FB4}, {0x1FC2, 0x1FC4}, {0x1FD0, 0x1FD3}, {0x1FE0, 0x1FE7}, {0x1FF2, 0x1FF4}, {0x2146, 0x2149}, {0x2C30, 0x2C5F}, {0x2C76, 0x2C7B}, {0x2D00, 0x2D25}, {0xA72F, 0xA731}, {0xA771, 0xA778}, {0xA793, 0xA795}, {0xAB30, 0xAB5A}, {0xAB60, 0xAB68}, {0xAB70, 0xABBF}, {0xFB00, 0xFB06}, {0xFB13, 0xFB17}, {0xFF41, 0xFF5A} #if CHRBITS > 16 ,{0x10428, 0x1044F}, {0x104D8, 0x104FB}, {0x10597, 0x105A1}, {0x105A3, 0x105B1}, | | | | | | | | | | | 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 | {0x1F90, 0x1F97}, {0x1FA0, 0x1FA7}, {0x1FB0, 0x1FB4}, {0x1FC2, 0x1FC4}, {0x1FD0, 0x1FD3}, {0x1FE0, 0x1FE7}, {0x1FF2, 0x1FF4}, {0x2146, 0x2149}, {0x2C30, 0x2C5F}, {0x2C76, 0x2C7B}, {0x2D00, 0x2D25}, {0xA72F, 0xA731}, {0xA771, 0xA778}, {0xA793, 0xA795}, {0xAB30, 0xAB5A}, {0xAB60, 0xAB68}, {0xAB70, 0xABBF}, {0xFB00, 0xFB06}, {0xFB13, 0xFB17}, {0xFF41, 0xFF5A} #if CHRBITS > 16 ,{0x10428, 0x1044F}, {0x104D8, 0x104FB}, {0x10597, 0x105A1}, {0x105A3, 0x105B1}, {0x105B3, 0x105B9}, {0x10CC0, 0x10CF2}, {0x10D70, 0x10D85}, {0x118C0, 0x118DF}, {0x16E60, 0x16E7F}, {0x1D41A, 0x1D433}, {0x1D44E, 0x1D454}, {0x1D456, 0x1D467}, {0x1D482, 0x1D49B}, {0x1D4B6, 0x1D4B9}, {0x1D4BD, 0x1D4C3}, {0x1D4C5, 0x1D4CF}, {0x1D4EA, 0x1D503}, {0x1D51E, 0x1D537}, {0x1D552, 0x1D56B}, {0x1D586, 0x1D59F}, {0x1D5BA, 0x1D5D3}, {0x1D5EE, 0x1D607}, {0x1D622, 0x1D63B}, {0x1D656, 0x1D66F}, {0x1D68A, 0x1D6A5}, {0x1D6C2, 0x1D6DA}, {0x1D6DC, 0x1D6E1}, {0x1D6FC, 0x1D714}, {0x1D716, 0x1D71B}, {0x1D736, 0x1D74E}, {0x1D750, 0x1D755}, {0x1D770, 0x1D788}, {0x1D78A, 0x1D78F}, {0x1D7AA, 0x1D7C2}, {0x1D7C4, 0x1D7C9}, {0x1DF00, 0x1DF09}, {0x1DF0B, 0x1DF1E}, {0x1DF25, 0x1DF2A}, {0x1E922, 0x1E943} #endif }; #define NUM_LOWER_RANGE ((int)(sizeof(lowerRangeTable)/sizeof(crange))) static const chr lowerCharTable[] = { 0xB5, 0x101, 0x103, 0x105, 0x107, 0x109, 0x10B, 0x10D, 0x10F, |
︙ | ︙ | |||
483 484 485 486 487 488 489 | 0x4A9, 0x4AB, 0x4AD, 0x4AF, 0x4B1, 0x4B3, 0x4B5, 0x4B7, 0x4B9, 0x4BB, 0x4BD, 0x4BF, 0x4C2, 0x4C4, 0x4C6, 0x4C8, 0x4CA, 0x4CC, 0x4CE, 0x4CF, 0x4D1, 0x4D3, 0x4D5, 0x4D7, 0x4D9, 0x4DB, 0x4DD, 0x4DF, 0x4E1, 0x4E3, 0x4E5, 0x4E7, 0x4E9, 0x4EB, 0x4ED, 0x4EF, 0x4F1, 0x4F3, 0x4F5, 0x4F7, 0x4F9, 0x4FB, 0x4FD, 0x4FF, 0x501, 0x503, 0x505, 0x507, 0x509, 0x50B, 0x50D, 0x50F, 0x511, 0x513, 0x515, 0x517, 0x519, 0x51B, 0x51D, 0x51F, 0x521, 0x523, 0x525, | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | > | 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 | 0x4A9, 0x4AB, 0x4AD, 0x4AF, 0x4B1, 0x4B3, 0x4B5, 0x4B7, 0x4B9, 0x4BB, 0x4BD, 0x4BF, 0x4C2, 0x4C4, 0x4C6, 0x4C8, 0x4CA, 0x4CC, 0x4CE, 0x4CF, 0x4D1, 0x4D3, 0x4D5, 0x4D7, 0x4D9, 0x4DB, 0x4DD, 0x4DF, 0x4E1, 0x4E3, 0x4E5, 0x4E7, 0x4E9, 0x4EB, 0x4ED, 0x4EF, 0x4F1, 0x4F3, 0x4F5, 0x4F7, 0x4F9, 0x4FB, 0x4FD, 0x4FF, 0x501, 0x503, 0x505, 0x507, 0x509, 0x50B, 0x50D, 0x50F, 0x511, 0x513, 0x515, 0x517, 0x519, 0x51B, 0x51D, 0x51F, 0x521, 0x523, 0x525, 0x527, 0x529, 0x52B, 0x52D, 0x52F, 0x1C8A, 0x1E01, 0x1E03, 0x1E05, 0x1E07, 0x1E09, 0x1E0B, 0x1E0D, 0x1E0F, 0x1E11, 0x1E13, 0x1E15, 0x1E17, 0x1E19, 0x1E1B, 0x1E1D, 0x1E1F, 0x1E21, 0x1E23, 0x1E25, 0x1E27, 0x1E29, 0x1E2B, 0x1E2D, 0x1E2F, 0x1E31, 0x1E33, 0x1E35, 0x1E37, 0x1E39, 0x1E3B, 0x1E3D, 0x1E3F, 0x1E41, 0x1E43, 0x1E45, 0x1E47, 0x1E49, 0x1E4B, 0x1E4D, 0x1E4F, 0x1E51, 0x1E53, 0x1E55, 0x1E57, 0x1E59, 0x1E5B, 0x1E5D, 0x1E5F, 0x1E61, 0x1E63, 0x1E65, 0x1E67, 0x1E69, 0x1E6B, 0x1E6D, 0x1E6F, 0x1E71, 0x1E73, 0x1E75, 0x1E77, 0x1E79, 0x1E7B, 0x1E7D, 0x1E7F, 0x1E81, 0x1E83, 0x1E85, 0x1E87, 0x1E89, 0x1E8B, 0x1E8D, 0x1E8F, 0x1E91, 0x1E93, 0x1E9F, 0x1EA1, 0x1EA3, 0x1EA5, 0x1EA7, 0x1EA9, 0x1EAB, 0x1EAD, 0x1EAF, 0x1EB1, 0x1EB3, 0x1EB5, 0x1EB7, 0x1EB9, 0x1EBB, 0x1EBD, 0x1EBF, 0x1EC1, 0x1EC3, 0x1EC5, 0x1EC7, 0x1EC9, 0x1ECB, 0x1ECD, 0x1ECF, 0x1ED1, 0x1ED3, 0x1ED5, 0x1ED7, 0x1ED9, 0x1EDB, 0x1EDD, 0x1EDF, 0x1EE1, 0x1EE3, 0x1EE5, 0x1EE7, 0x1EE9, 0x1EEB, 0x1EED, 0x1EEF, 0x1EF1, 0x1EF3, 0x1EF5, 0x1EF7, 0x1EF9, 0x1EFB, 0x1EFD, 0x1FB6, 0x1FB7, 0x1FBE, 0x1FC6, 0x1FC7, 0x1FD6, 0x1FD7, 0x1FF6, 0x1FF7, 0x210A, 0x210E, 0x210F, 0x2113, 0x212F, 0x2134, 0x2139, 0x213C, 0x213D, 0x214E, 0x2184, 0x2C61, 0x2C65, 0x2C66, 0x2C68, 0x2C6A, 0x2C6C, 0x2C71, 0x2C73, 0x2C74, 0x2C81, 0x2C83, 0x2C85, 0x2C87, 0x2C89, 0x2C8B, 0x2C8D, 0x2C8F, 0x2C91, 0x2C93, 0x2C95, 0x2C97, 0x2C99, 0x2C9B, 0x2C9D, 0x2C9F, 0x2CA1, 0x2CA3, 0x2CA5, 0x2CA7, 0x2CA9, 0x2CAB, 0x2CAD, 0x2CAF, 0x2CB1, 0x2CB3, 0x2CB5, 0x2CB7, 0x2CB9, 0x2CBB, 0x2CBD, 0x2CBF, 0x2CC1, 0x2CC3, 0x2CC5, 0x2CC7, 0x2CC9, 0x2CCB, 0x2CCD, 0x2CCF, 0x2CD1, 0x2CD3, 0x2CD5, 0x2CD7, 0x2CD9, 0x2CDB, 0x2CDD, 0x2CDF, 0x2CE1, 0x2CE3, 0x2CE4, 0x2CEC, 0x2CEE, 0x2CF3, 0x2D27, 0x2D2D, 0xA641, 0xA643, 0xA645, 0xA647, 0xA649, 0xA64B, 0xA64D, 0xA64F, 0xA651, 0xA653, 0xA655, 0xA657, 0xA659, 0xA65B, 0xA65D, 0xA65F, 0xA661, 0xA663, 0xA665, 0xA667, 0xA669, 0xA66B, 0xA66D, 0xA681, 0xA683, 0xA685, 0xA687, 0xA689, 0xA68B, 0xA68D, 0xA68F, 0xA691, 0xA693, 0xA695, 0xA697, 0xA699, 0xA69B, 0xA723, 0xA725, 0xA727, 0xA729, 0xA72B, 0xA72D, 0xA733, 0xA735, 0xA737, 0xA739, 0xA73B, 0xA73D, 0xA73F, 0xA741, 0xA743, 0xA745, 0xA747, 0xA749, 0xA74B, 0xA74D, 0xA74F, 0xA751, 0xA753, 0xA755, 0xA757, 0xA759, 0xA75B, 0xA75D, 0xA75F, 0xA761, 0xA763, 0xA765, 0xA767, 0xA769, 0xA76B, 0xA76D, 0xA76F, 0xA77A, 0xA77C, 0xA77F, 0xA781, 0xA783, 0xA785, 0xA787, 0xA78C, 0xA78E, 0xA791, 0xA797, 0xA799, 0xA79B, 0xA79D, 0xA79F, 0xA7A1, 0xA7A3, 0xA7A5, 0xA7A7, 0xA7A9, 0xA7AF, 0xA7B5, 0xA7B7, 0xA7B9, 0xA7BB, 0xA7BD, 0xA7BF, 0xA7C1, 0xA7C3, 0xA7C8, 0xA7CA, 0xA7CD, 0xA7D1, 0xA7D3, 0xA7D5, 0xA7D7, 0xA7D9, 0xA7DB, 0xA7F6, 0xA7FA #if CHRBITS > 16 ,0x105BB, 0x105BC, 0x1D4BB, 0x1D7CB #endif }; #define NUM_LOWER_CHAR ((int)(sizeof(lowerCharTable)/sizeof(chr))) |
︙ | ︙ | |||
544 545 546 547 548 549 550 | {0x1F68, 0x1F6F}, {0x1FB8, 0x1FBB}, {0x1FC8, 0x1FCB}, {0x1FD8, 0x1FDB}, {0x1FE8, 0x1FEC}, {0x1FF8, 0x1FFB}, {0x210B, 0x210D}, {0x2110, 0x2112}, {0x2119, 0x211D}, {0x212A, 0x212D}, {0x2130, 0x2133}, {0x2C00, 0x2C2F}, {0x2C62, 0x2C64}, {0x2C6D, 0x2C70}, {0x2C7E, 0x2C80}, {0xA7AA, 0xA7AE}, {0xA7B0, 0xA7B4}, {0xA7C4, 0xA7C7}, {0xFF21, 0xFF3A} #if CHRBITS > 16 ,{0x10400, 0x10427}, {0x104B0, 0x104D3}, {0x10570, 0x1057A}, {0x1057C, 0x1058A}, | | | | | | | | > | 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 | {0x1F68, 0x1F6F}, {0x1FB8, 0x1FBB}, {0x1FC8, 0x1FCB}, {0x1FD8, 0x1FDB}, {0x1FE8, 0x1FEC}, {0x1FF8, 0x1FFB}, {0x210B, 0x210D}, {0x2110, 0x2112}, {0x2119, 0x211D}, {0x212A, 0x212D}, {0x2130, 0x2133}, {0x2C00, 0x2C2F}, {0x2C62, 0x2C64}, {0x2C6D, 0x2C70}, {0x2C7E, 0x2C80}, {0xA7AA, 0xA7AE}, {0xA7B0, 0xA7B4}, {0xA7C4, 0xA7C7}, {0xFF21, 0xFF3A} #if CHRBITS > 16 ,{0x10400, 0x10427}, {0x104B0, 0x104D3}, {0x10570, 0x1057A}, {0x1057C, 0x1058A}, {0x1058C, 0x10592}, {0x10C80, 0x10CB2}, {0x10D50, 0x10D65}, {0x118A0, 0x118BF}, {0x16E40, 0x16E5F}, {0x1D400, 0x1D419}, {0x1D434, 0x1D44D}, {0x1D468, 0x1D481}, {0x1D4A9, 0x1D4AC}, {0x1D4AE, 0x1D4B5}, {0x1D4D0, 0x1D4E9}, {0x1D507, 0x1D50A}, {0x1D50D, 0x1D514}, {0x1D516, 0x1D51C}, {0x1D53B, 0x1D53E}, {0x1D540, 0x1D544}, {0x1D54A, 0x1D550}, {0x1D56C, 0x1D585}, {0x1D5A0, 0x1D5B9}, {0x1D5D4, 0x1D5ED}, {0x1D608, 0x1D621}, {0x1D63C, 0x1D655}, {0x1D670, 0x1D689}, {0x1D6A8, 0x1D6C0}, {0x1D6E2, 0x1D6FA}, {0x1D71C, 0x1D734}, {0x1D756, 0x1D76E}, {0x1D790, 0x1D7A8}, {0x1E900, 0x1E921} #endif }; #define NUM_UPPER_RANGE ((int)(sizeof(upperRangeTable)/sizeof(crange))) static const chr upperCharTable[] = { 0x100, 0x102, 0x104, 0x106, 0x108, 0x10A, 0x10C, 0x10E, 0x110, |
︙ | ︙ | |||
587 588 589 590 591 592 593 | 0x4B0, 0x4B2, 0x4B4, 0x4B6, 0x4B8, 0x4BA, 0x4BC, 0x4BE, 0x4C0, 0x4C1, 0x4C3, 0x4C5, 0x4C7, 0x4C9, 0x4CB, 0x4CD, 0x4D0, 0x4D2, 0x4D4, 0x4D6, 0x4D8, 0x4DA, 0x4DC, 0x4DE, 0x4E0, 0x4E2, 0x4E4, 0x4E6, 0x4E8, 0x4EA, 0x4EC, 0x4EE, 0x4F0, 0x4F2, 0x4F4, 0x4F6, 0x4F8, 0x4FA, 0x4FC, 0x4FE, 0x500, 0x502, 0x504, 0x506, 0x508, 0x50A, 0x50C, 0x50E, 0x510, 0x512, 0x514, 0x516, 0x518, 0x51A, 0x51C, 0x51E, 0x520, 0x522, 0x524, 0x526, 0x528, 0x52A, 0x52C, | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 | 0x4B0, 0x4B2, 0x4B4, 0x4B6, 0x4B8, 0x4BA, 0x4BC, 0x4BE, 0x4C0, 0x4C1, 0x4C3, 0x4C5, 0x4C7, 0x4C9, 0x4CB, 0x4CD, 0x4D0, 0x4D2, 0x4D4, 0x4D6, 0x4D8, 0x4DA, 0x4DC, 0x4DE, 0x4E0, 0x4E2, 0x4E4, 0x4E6, 0x4E8, 0x4EA, 0x4EC, 0x4EE, 0x4F0, 0x4F2, 0x4F4, 0x4F6, 0x4F8, 0x4FA, 0x4FC, 0x4FE, 0x500, 0x502, 0x504, 0x506, 0x508, 0x50A, 0x50C, 0x50E, 0x510, 0x512, 0x514, 0x516, 0x518, 0x51A, 0x51C, 0x51E, 0x520, 0x522, 0x524, 0x526, 0x528, 0x52A, 0x52C, 0x52E, 0x10C7, 0x10CD, 0x1C89, 0x1E00, 0x1E02, 0x1E04, 0x1E06, 0x1E08, 0x1E0A, 0x1E0C, 0x1E0E, 0x1E10, 0x1E12, 0x1E14, 0x1E16, 0x1E18, 0x1E1A, 0x1E1C, 0x1E1E, 0x1E20, 0x1E22, 0x1E24, 0x1E26, 0x1E28, 0x1E2A, 0x1E2C, 0x1E2E, 0x1E30, 0x1E32, 0x1E34, 0x1E36, 0x1E38, 0x1E3A, 0x1E3C, 0x1E3E, 0x1E40, 0x1E42, 0x1E44, 0x1E46, 0x1E48, 0x1E4A, 0x1E4C, 0x1E4E, 0x1E50, 0x1E52, 0x1E54, 0x1E56, 0x1E58, 0x1E5A, 0x1E5C, 0x1E5E, 0x1E60, 0x1E62, 0x1E64, 0x1E66, 0x1E68, 0x1E6A, 0x1E6C, 0x1E6E, 0x1E70, 0x1E72, 0x1E74, 0x1E76, 0x1E78, 0x1E7A, 0x1E7C, 0x1E7E, 0x1E80, 0x1E82, 0x1E84, 0x1E86, 0x1E88, 0x1E8A, 0x1E8C, 0x1E8E, 0x1E90, 0x1E92, 0x1E94, 0x1E9E, 0x1EA0, 0x1EA2, 0x1EA4, 0x1EA6, 0x1EA8, 0x1EAA, 0x1EAC, 0x1EAE, 0x1EB0, 0x1EB2, 0x1EB4, 0x1EB6, 0x1EB8, 0x1EBA, 0x1EBC, 0x1EBE, 0x1EC0, 0x1EC2, 0x1EC4, 0x1EC6, 0x1EC8, 0x1ECA, 0x1ECC, 0x1ECE, 0x1ED0, 0x1ED2, 0x1ED4, 0x1ED6, 0x1ED8, 0x1EDA, 0x1EDC, 0x1EDE, 0x1EE0, 0x1EE2, 0x1EE4, 0x1EE6, 0x1EE8, 0x1EEA, 0x1EEC, 0x1EEE, 0x1EF0, 0x1EF2, 0x1EF4, 0x1EF6, 0x1EF8, 0x1EFA, 0x1EFC, 0x1EFE, 0x1F59, 0x1F5B, 0x1F5D, 0x1F5F, 0x2102, 0x2107, 0x2115, 0x2124, 0x2126, 0x2128, 0x213E, 0x213F, 0x2145, 0x2183, 0x2C60, 0x2C67, 0x2C69, 0x2C6B, 0x2C72, 0x2C75, 0x2C82, 0x2C84, 0x2C86, 0x2C88, 0x2C8A, 0x2C8C, 0x2C8E, 0x2C90, 0x2C92, 0x2C94, 0x2C96, 0x2C98, 0x2C9A, 0x2C9C, 0x2C9E, 0x2CA0, 0x2CA2, 0x2CA4, 0x2CA6, 0x2CA8, 0x2CAA, 0x2CAC, 0x2CAE, 0x2CB0, 0x2CB2, 0x2CB4, 0x2CB6, 0x2CB8, 0x2CBA, 0x2CBC, 0x2CBE, 0x2CC0, 0x2CC2, 0x2CC4, 0x2CC6, 0x2CC8, 0x2CCA, 0x2CCC, 0x2CCE, 0x2CD0, 0x2CD2, 0x2CD4, 0x2CD6, 0x2CD8, 0x2CDA, 0x2CDC, 0x2CDE, 0x2CE0, 0x2CE2, 0x2CEB, 0x2CED, 0x2CF2, 0xA640, 0xA642, 0xA644, 0xA646, 0xA648, 0xA64A, 0xA64C, 0xA64E, 0xA650, 0xA652, 0xA654, 0xA656, 0xA658, 0xA65A, 0xA65C, 0xA65E, 0xA660, 0xA662, 0xA664, 0xA666, 0xA668, 0xA66A, 0xA66C, 0xA680, 0xA682, 0xA684, 0xA686, 0xA688, 0xA68A, 0xA68C, 0xA68E, 0xA690, 0xA692, 0xA694, 0xA696, 0xA698, 0xA69A, 0xA722, 0xA724, 0xA726, 0xA728, 0xA72A, 0xA72C, 0xA72E, 0xA732, 0xA734, 0xA736, 0xA738, 0xA73A, 0xA73C, 0xA73E, 0xA740, 0xA742, 0xA744, 0xA746, 0xA748, 0xA74A, 0xA74C, 0xA74E, 0xA750, 0xA752, 0xA754, 0xA756, 0xA758, 0xA75A, 0xA75C, 0xA75E, 0xA760, 0xA762, 0xA764, 0xA766, 0xA768, 0xA76A, 0xA76C, 0xA76E, 0xA779, 0xA77B, 0xA77D, 0xA77E, 0xA780, 0xA782, 0xA784, 0xA786, 0xA78B, 0xA78D, 0xA790, 0xA792, 0xA796, 0xA798, 0xA79A, 0xA79C, 0xA79E, 0xA7A0, 0xA7A2, 0xA7A4, 0xA7A6, 0xA7A8, 0xA7B6, 0xA7B8, 0xA7BA, 0xA7BC, 0xA7BE, 0xA7C0, 0xA7C2, 0xA7C9, 0xA7CB, 0xA7CC, 0xA7D0, 0xA7D6, 0xA7D8, 0xA7DA, 0xA7DC, 0xA7F5 #if CHRBITS > 16 ,0x10594, 0x10595, 0x1D49C, 0x1D49E, 0x1D49F, 0x1D4A2, 0x1D4A5, 0x1D4A6, 0x1D504, 0x1D505, 0x1D538, 0x1D539, 0x1D546, 0x1D7CA #endif }; #define NUM_UPPER_CHAR ((int)(sizeof(upperCharTable)/sizeof(chr))) /* * Unicode: unicode print characters excluding space. */ static const crange graphRangeTable[] = { {0x21, 0x7E}, {0xA1, 0xAC}, {0xAE, 0x377}, {0x37A, 0x37F}, {0x384, 0x38A}, {0x38E, 0x3A1}, {0x3A3, 0x52F}, {0x531, 0x556}, {0x559, 0x58A}, {0x58D, 0x58F}, {0x591, 0x5C7}, {0x5D0, 0x5EA}, {0x5EF, 0x5F4}, {0x606, 0x61B}, {0x61D, 0x6DC}, {0x6DE, 0x70D}, {0x710, 0x74A}, {0x74D, 0x7B1}, {0x7C0, 0x7FA}, {0x7FD, 0x82D}, {0x830, 0x83E}, {0x840, 0x85B}, {0x860, 0x86A}, {0x870, 0x88E}, {0x897, 0x8E1}, {0x8E3, 0x983}, {0x985, 0x98C}, {0x993, 0x9A8}, {0x9AA, 0x9B0}, {0x9B6, 0x9B9}, {0x9BC, 0x9C4}, {0x9CB, 0x9CE}, {0x9DF, 0x9E3}, {0x9E6, 0x9FE}, {0xA01, 0xA03}, {0xA05, 0xA0A}, {0xA13, 0xA28}, {0xA2A, 0xA30}, {0xA3E, 0xA42}, {0xA4B, 0xA4D}, {0xA59, 0xA5C}, {0xA66, 0xA76}, {0xA81, 0xA83}, {0xA85, 0xA8D}, {0xA8F, 0xA91}, {0xA93, 0xAA8}, {0xAAA, 0xAB0}, {0xAB5, 0xAB9}, {0xABC, 0xAC5}, {0xAC7, 0xAC9}, {0xACB, 0xACD}, {0xAE0, 0xAE3}, {0xAE6, 0xAF1}, {0xAF9, 0xAFF}, {0xB01, 0xB03}, {0xB05, 0xB0C}, |
︙ | ︙ | |||
679 680 681 682 683 684 685 | {0x171F, 0x1736}, {0x1740, 0x1753}, {0x1760, 0x176C}, {0x176E, 0x1770}, {0x1780, 0x17DD}, {0x17E0, 0x17E9}, {0x17F0, 0x17F9}, {0x1800, 0x180D}, {0x180F, 0x1819}, {0x1820, 0x1878}, {0x1880, 0x18AA}, {0x18B0, 0x18F5}, {0x1900, 0x191E}, {0x1920, 0x192B}, {0x1930, 0x193B}, {0x1944, 0x196D}, {0x1970, 0x1974}, {0x1980, 0x19AB}, {0x19B0, 0x19C9}, {0x19D0, 0x19DA}, {0x19DE, 0x1A1B}, {0x1A1E, 0x1A5E}, {0x1A60, 0x1A7C}, {0x1A7F, 0x1A89}, {0x1A90, 0x1A99}, {0x1AA0, 0x1AAD}, {0x1AB0, 0x1ACE}, {0x1B00, 0x1B4C}, | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | > | | | > | | > | | | | | | > | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | > | | | < | | | | > | | | | | | | | | 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 | {0x171F, 0x1736}, {0x1740, 0x1753}, {0x1760, 0x176C}, {0x176E, 0x1770}, {0x1780, 0x17DD}, {0x17E0, 0x17E9}, {0x17F0, 0x17F9}, {0x1800, 0x180D}, {0x180F, 0x1819}, {0x1820, 0x1878}, {0x1880, 0x18AA}, {0x18B0, 0x18F5}, {0x1900, 0x191E}, {0x1920, 0x192B}, {0x1930, 0x193B}, {0x1944, 0x196D}, {0x1970, 0x1974}, {0x1980, 0x19AB}, {0x19B0, 0x19C9}, {0x19D0, 0x19DA}, {0x19DE, 0x1A1B}, {0x1A1E, 0x1A5E}, {0x1A60, 0x1A7C}, {0x1A7F, 0x1A89}, {0x1A90, 0x1A99}, {0x1AA0, 0x1AAD}, {0x1AB0, 0x1ACE}, {0x1B00, 0x1B4C}, {0x1B4E, 0x1BF3}, {0x1BFC, 0x1C37}, {0x1C3B, 0x1C49}, {0x1C4D, 0x1C8A}, {0x1C90, 0x1CBA}, {0x1CBD, 0x1CC7}, {0x1CD0, 0x1CFA}, {0x1D00, 0x1F15}, {0x1F18, 0x1F1D}, {0x1F20, 0x1F45}, {0x1F48, 0x1F4D}, {0x1F50, 0x1F57}, {0x1F5F, 0x1F7D}, {0x1F80, 0x1FB4}, {0x1FB6, 0x1FC4}, {0x1FC6, 0x1FD3}, {0x1FD6, 0x1FDB}, {0x1FDD, 0x1FEF}, {0x1FF2, 0x1FF4}, {0x1FF6, 0x1FFE}, {0x2010, 0x2027}, {0x2030, 0x205E}, {0x2074, 0x208E}, {0x2090, 0x209C}, {0x20A0, 0x20C0}, {0x20D0, 0x20F0}, {0x2100, 0x218B}, {0x2190, 0x2429}, {0x2440, 0x244A}, {0x2460, 0x2B73}, {0x2B76, 0x2B95}, {0x2B97, 0x2CF3}, {0x2CF9, 0x2D25}, {0x2D30, 0x2D67}, {0x2D7F, 0x2D96}, {0x2DA0, 0x2DA6}, {0x2DA8, 0x2DAE}, {0x2DB0, 0x2DB6}, {0x2DB8, 0x2DBE}, {0x2DC0, 0x2DC6}, {0x2DC8, 0x2DCE}, {0x2DD0, 0x2DD6}, {0x2DD8, 0x2DDE}, {0x2DE0, 0x2E5D}, {0x2E80, 0x2E99}, {0x2E9B, 0x2EF3}, {0x2F00, 0x2FD5}, {0x2FF0, 0x2FFF}, {0x3001, 0x303F}, {0x3041, 0x3096}, {0x3099, 0x30FF}, {0x3105, 0x312F}, {0x3131, 0x318E}, {0x3190, 0x31E5}, {0x31EF, 0x321E}, {0x3220, 0xA48C}, {0xA490, 0xA4C6}, {0xA4D0, 0xA62B}, {0xA640, 0xA6F7}, {0xA700, 0xA7CD}, {0xA7D5, 0xA7DC}, {0xA7F2, 0xA82C}, {0xA830, 0xA839}, {0xA840, 0xA877}, {0xA880, 0xA8C5}, {0xA8CE, 0xA8D9}, {0xA8E0, 0xA953}, {0xA95F, 0xA97C}, {0xA980, 0xA9CD}, {0xA9CF, 0xA9D9}, {0xA9DE, 0xA9FE}, {0xAA00, 0xAA36}, {0xAA40, 0xAA4D}, {0xAA50, 0xAA59}, {0xAA5C, 0xAAC2}, {0xAADB, 0xAAF6}, {0xAB01, 0xAB06}, {0xAB09, 0xAB0E}, {0xAB11, 0xAB16}, {0xAB20, 0xAB26}, {0xAB28, 0xAB2E}, {0xAB30, 0xAB6B}, {0xAB70, 0xABED}, {0xABF0, 0xABF9}, {0xAC00, 0xD7A3}, {0xD7B0, 0xD7C6}, {0xD7CB, 0xD7FB}, {0xF900, 0xFA6D}, {0xFA70, 0xFAD9}, {0xFB00, 0xFB06}, {0xFB13, 0xFB17}, {0xFB1D, 0xFB36}, {0xFB38, 0xFB3C}, {0xFB46, 0xFBC2}, {0xFBD3, 0xFD8F}, {0xFD92, 0xFDC7}, {0xFDF0, 0xFE19}, {0xFE20, 0xFE52}, {0xFE54, 0xFE66}, {0xFE68, 0xFE6B}, {0xFE70, 0xFE74}, {0xFE76, 0xFEFC}, {0xFF01, 0xFFBE}, {0xFFC2, 0xFFC7}, {0xFFCA, 0xFFCF}, {0xFFD2, 0xFFD7}, {0xFFDA, 0xFFDC}, {0xFFE0, 0xFFE6}, {0xFFE8, 0xFFEE} #if CHRBITS > 16 ,{0x10000, 0x1000B}, {0x1000D, 0x10026}, {0x10028, 0x1003A}, {0x1003F, 0x1004D}, {0x10050, 0x1005D}, {0x10080, 0x100FA}, {0x10100, 0x10102}, {0x10107, 0x10133}, {0x10137, 0x1018E}, {0x10190, 0x1019C}, {0x101D0, 0x101FD}, {0x10280, 0x1029C}, {0x102A0, 0x102D0}, {0x102E0, 0x102FB}, {0x10300, 0x10323}, {0x1032D, 0x1034A}, {0x10350, 0x1037A}, {0x10380, 0x1039D}, {0x1039F, 0x103C3}, {0x103C8, 0x103D5}, {0x10400, 0x1049D}, {0x104A0, 0x104A9}, {0x104B0, 0x104D3}, {0x104D8, 0x104FB}, {0x10500, 0x10527}, {0x10530, 0x10563}, {0x1056F, 0x1057A}, {0x1057C, 0x1058A}, {0x1058C, 0x10592}, {0x10597, 0x105A1}, {0x105A3, 0x105B1}, {0x105B3, 0x105B9}, {0x105C0, 0x105F3}, {0x10600, 0x10736}, {0x10740, 0x10755}, {0x10760, 0x10767}, {0x10780, 0x10785}, {0x10787, 0x107B0}, {0x107B2, 0x107BA}, {0x10800, 0x10805}, {0x1080A, 0x10835}, {0x1083F, 0x10855}, {0x10857, 0x1089E}, {0x108A7, 0x108AF}, {0x108E0, 0x108F2}, {0x108FB, 0x1091B}, {0x1091F, 0x10939}, {0x10980, 0x109B7}, {0x109BC, 0x109CF}, {0x109D2, 0x10A03}, {0x10A0C, 0x10A13}, {0x10A15, 0x10A17}, {0x10A19, 0x10A35}, {0x10A38, 0x10A3A}, {0x10A3F, 0x10A48}, {0x10A50, 0x10A58}, {0x10A60, 0x10A9F}, {0x10AC0, 0x10AE6}, {0x10AEB, 0x10AF6}, {0x10B00, 0x10B35}, {0x10B39, 0x10B55}, {0x10B58, 0x10B72}, {0x10B78, 0x10B91}, {0x10B99, 0x10B9C}, {0x10BA9, 0x10BAF}, {0x10C00, 0x10C48}, {0x10C80, 0x10CB2}, {0x10CC0, 0x10CF2}, {0x10CFA, 0x10D27}, {0x10D30, 0x10D39}, {0x10D40, 0x10D65}, {0x10D69, 0x10D85}, {0x10E60, 0x10E7E}, {0x10E80, 0x10EA9}, {0x10EAB, 0x10EAD}, {0x10EC2, 0x10EC4}, {0x10EFC, 0x10F27}, {0x10F30, 0x10F59}, {0x10F70, 0x10F89}, {0x10FB0, 0x10FCB}, {0x10FE0, 0x10FF6}, {0x11000, 0x1104D}, {0x11052, 0x11075}, {0x1107F, 0x110BC}, {0x110BE, 0x110C2}, {0x110D0, 0x110E8}, {0x110F0, 0x110F9}, {0x11100, 0x11134}, {0x11136, 0x11147}, {0x11150, 0x11176}, {0x11180, 0x111DF}, {0x111E1, 0x111F4}, {0x11200, 0x11211}, {0x11213, 0x11241}, {0x11280, 0x11286}, {0x1128A, 0x1128D}, {0x1128F, 0x1129D}, {0x1129F, 0x112A9}, {0x112B0, 0x112EA}, {0x112F0, 0x112F9}, {0x11300, 0x11303}, {0x11305, 0x1130C}, {0x11313, 0x11328}, {0x1132A, 0x11330}, {0x11335, 0x11339}, {0x1133B, 0x11344}, {0x1134B, 0x1134D}, {0x1135D, 0x11363}, {0x11366, 0x1136C}, {0x11370, 0x11374}, {0x11380, 0x11389}, {0x11390, 0x113B5}, {0x113B7, 0x113C0}, {0x113C7, 0x113CA}, {0x113CC, 0x113D5}, {0x11400, 0x1145B}, {0x1145D, 0x11461}, {0x11480, 0x114C7}, {0x114D0, 0x114D9}, {0x11580, 0x115B5}, {0x115B8, 0x115DD}, {0x11600, 0x11644}, {0x11650, 0x11659}, {0x11660, 0x1166C}, {0x11680, 0x116B9}, {0x116C0, 0x116C9}, {0x116D0, 0x116E3}, {0x11700, 0x1171A}, {0x1171D, 0x1172B}, {0x11730, 0x11746}, {0x11800, 0x1183B}, {0x118A0, 0x118F2}, {0x118FF, 0x11906}, {0x1190C, 0x11913}, {0x11918, 0x11935}, {0x1193B, 0x11946}, {0x11950, 0x11959}, {0x119A0, 0x119A7}, {0x119AA, 0x119D7}, {0x119DA, 0x119E4}, {0x11A00, 0x11A47}, {0x11A50, 0x11AA2}, {0x11AB0, 0x11AF8}, {0x11B00, 0x11B09}, {0x11BC0, 0x11BE1}, {0x11BF0, 0x11BF9}, {0x11C00, 0x11C08}, {0x11C0A, 0x11C36}, {0x11C38, 0x11C45}, {0x11C50, 0x11C6C}, {0x11C70, 0x11C8F}, {0x11C92, 0x11CA7}, {0x11CA9, 0x11CB6}, {0x11D00, 0x11D06}, {0x11D0B, 0x11D36}, {0x11D3F, 0x11D47}, {0x11D50, 0x11D59}, {0x11D60, 0x11D65}, {0x11D6A, 0x11D8E}, {0x11D93, 0x11D98}, {0x11DA0, 0x11DA9}, {0x11EE0, 0x11EF8}, {0x11F00, 0x11F10}, {0x11F12, 0x11F3A}, {0x11F3E, 0x11F5A}, {0x11FC0, 0x11FF1}, {0x11FFF, 0x12399}, {0x12400, 0x1246E}, {0x12470, 0x12474}, {0x12480, 0x12543}, {0x12F90, 0x12FF2}, {0x13000, 0x1342F}, {0x13440, 0x13455}, {0x13460, 0x143FA}, {0x14400, 0x14646}, {0x16100, 0x16139}, {0x16800, 0x16A38}, {0x16A40, 0x16A5E}, {0x16A60, 0x16A69}, {0x16A6E, 0x16ABE}, {0x16AC0, 0x16AC9}, {0x16AD0, 0x16AED}, {0x16AF0, 0x16AF5}, {0x16B00, 0x16B45}, {0x16B50, 0x16B59}, {0x16B5B, 0x16B61}, {0x16B63, 0x16B77}, {0x16B7D, 0x16B8F}, {0x16D40, 0x16D79}, {0x16E40, 0x16E9A}, {0x16F00, 0x16F4A}, {0x16F4F, 0x16F87}, {0x16F8F, 0x16F9F}, {0x16FE0, 0x16FE4}, {0x17000, 0x187F7}, {0x18800, 0x18CD5}, {0x18CFF, 0x18D08}, {0x1AFF0, 0x1AFF3}, {0x1AFF5, 0x1AFFB}, {0x1B000, 0x1B122}, {0x1B150, 0x1B152}, {0x1B164, 0x1B167}, {0x1B170, 0x1B2FB}, {0x1BC00, 0x1BC6A}, {0x1BC70, 0x1BC7C}, {0x1BC80, 0x1BC88}, {0x1BC90, 0x1BC99}, {0x1BC9C, 0x1BC9F}, {0x1CC00, 0x1CCF9}, {0x1CD00, 0x1CEB3}, {0x1CF00, 0x1CF2D}, {0x1CF30, 0x1CF46}, {0x1CF50, 0x1CFC3}, {0x1D000, 0x1D0F5}, {0x1D100, 0x1D126}, {0x1D129, 0x1D172}, {0x1D17B, 0x1D1EA}, {0x1D200, 0x1D245}, {0x1D2C0, 0x1D2D3}, {0x1D2E0, 0x1D2F3}, {0x1D300, 0x1D356}, {0x1D360, 0x1D378}, {0x1D400, 0x1D454}, {0x1D456, 0x1D49C}, {0x1D4A9, 0x1D4AC}, {0x1D4AE, 0x1D4B9}, {0x1D4BD, 0x1D4C3}, {0x1D4C5, 0x1D505}, {0x1D507, 0x1D50A}, {0x1D50D, 0x1D514}, {0x1D516, 0x1D51C}, {0x1D51E, 0x1D539}, {0x1D53B, 0x1D53E}, {0x1D540, 0x1D544}, {0x1D54A, 0x1D550}, {0x1D552, 0x1D6A5}, {0x1D6A8, 0x1D7CB}, {0x1D7CE, 0x1DA8B}, {0x1DA9B, 0x1DA9F}, {0x1DAA1, 0x1DAAF}, {0x1DF00, 0x1DF1E}, {0x1DF25, 0x1DF2A}, {0x1E000, 0x1E006}, {0x1E008, 0x1E018}, {0x1E01B, 0x1E021}, {0x1E026, 0x1E02A}, {0x1E030, 0x1E06D}, {0x1E100, 0x1E12C}, {0x1E130, 0x1E13D}, {0x1E140, 0x1E149}, {0x1E290, 0x1E2AE}, {0x1E2C0, 0x1E2F9}, {0x1E4D0, 0x1E4F9}, {0x1E5D0, 0x1E5FA}, {0x1E7E0, 0x1E7E6}, {0x1E7E8, 0x1E7EB}, {0x1E7F0, 0x1E7FE}, {0x1E800, 0x1E8C4}, {0x1E8C7, 0x1E8D6}, {0x1E900, 0x1E94B}, {0x1E950, 0x1E959}, {0x1EC71, 0x1ECB4}, {0x1ED01, 0x1ED3D}, {0x1EE00, 0x1EE03}, {0x1EE05, 0x1EE1F}, {0x1EE29, 0x1EE32}, {0x1EE34, 0x1EE37}, {0x1EE4D, 0x1EE4F}, {0x1EE67, 0x1EE6A}, {0x1EE6C, 0x1EE72}, {0x1EE74, 0x1EE77}, {0x1EE79, 0x1EE7C}, {0x1EE80, 0x1EE89}, {0x1EE8B, 0x1EE9B}, {0x1EEA1, 0x1EEA3}, {0x1EEA5, 0x1EEA9}, {0x1EEAB, 0x1EEBB}, {0x1F000, 0x1F02B}, {0x1F030, 0x1F093}, {0x1F0A0, 0x1F0AE}, {0x1F0B1, 0x1F0BF}, {0x1F0C1, 0x1F0CF}, {0x1F0D1, 0x1F0F5}, {0x1F100, 0x1F1AD}, {0x1F1E6, 0x1F202}, {0x1F210, 0x1F23B}, {0x1F240, 0x1F248}, {0x1F260, 0x1F265}, {0x1F300, 0x1F6D7}, {0x1F6DC, 0x1F6EC}, {0x1F6F0, 0x1F6FC}, {0x1F700, 0x1F776}, {0x1F77B, 0x1F7D9}, {0x1F7E0, 0x1F7EB}, {0x1F800, 0x1F80B}, {0x1F810, 0x1F847}, {0x1F850, 0x1F859}, {0x1F860, 0x1F887}, {0x1F890, 0x1F8AD}, {0x1F8B0, 0x1F8BB}, {0x1F900, 0x1FA53}, {0x1FA60, 0x1FA6D}, {0x1FA70, 0x1FA7C}, {0x1FA80, 0x1FA89}, {0x1FA8F, 0x1FAC6}, {0x1FACE, 0x1FADC}, {0x1FADF, 0x1FAE9}, {0x1FAF0, 0x1FAF8}, {0x1FB00, 0x1FB92}, {0x1FB94, 0x1FBF9}, {0x20000, 0x2A6DF}, {0x2A700, 0x2B739}, {0x2B740, 0x2B81D}, {0x2B820, 0x2CEA1}, {0x2CEB0, 0x2EBE0}, {0x2EBF0, 0x2EE5D}, {0x2F800, 0x2FA1D}, {0x30000, 0x3134A}, {0x31350, 0x323AF}, {0xE0100, 0xE01EF} #endif }; #define NUM_GRAPH_RANGE ((int)(sizeof(graphRangeTable)/sizeof(crange))) static const chr graphCharTable[] = { 0x38C, 0x85E, 0x98F, 0x990, 0x9B2, 0x9C7, 0x9C8, 0x9D7, 0x9DC, 0x9DD, 0xA0F, 0xA10, 0xA32, 0xA33, 0xA35, 0xA36, 0xA38, 0xA39, 0xA3C, 0xA47, 0xA48, 0xA51, 0xA5E, 0xAB2, 0xAB3, 0xAD0, 0xB0F, 0xB10, 0xB32, 0xB33, 0xB47, 0xB48, 0xB5C, 0xB5D, 0xB82, 0xB83, 0xB99, 0xB9A, 0xB9C, 0xB9E, 0xB9F, 0xBA3, 0xBA4, 0xBD0, 0xBD7, 0xC55, 0xC56, 0xC5D, 0xCD5, 0xCD6, 0xCDD, 0xCDE, 0xDBD, 0xDCA, 0xDD6, 0xE81, 0xE82, 0xE84, 0xEA5, 0xEC6, 0x10C7, 0x10CD, 0x1258, 0x12C0, 0x1772, 0x1773, 0x1940, 0x1F59, 0x1F5B, 0x1F5D, 0x2070, 0x2071, 0x2D27, 0x2D2D, 0x2D6F, 0x2D70, 0xA7D0, 0xA7D1, 0xA7D3, 0xFB3E, 0xFB40, 0xFB41, 0xFB43, 0xFB44, 0xFDCF, 0xFFFC, 0xFFFD #if CHRBITS > 16 ,0x1003C, 0x1003D, 0x101A0, 0x10594, 0x10595, 0x105BB, 0x105BC, 0x10808, 0x10837, 0x10838, 0x1083C, 0x108F4, 0x108F5, 0x1093F, 0x10A05, 0x10A06, 0x10D8E, 0x10D8F, 0x10EB0, 0x10EB1, 0x11288, 0x1130F, 0x11310, 0x11332, 0x11333, 0x11347, 0x11348, 0x11350, 0x11357, 0x1138B, 0x1138E, 0x113C2, 0x113C5, 0x113D7, 0x113D8, 0x113E1, 0x113E2, 0x11909, 0x11915, 0x11916, 0x11937, 0x11938, 0x11D08, 0x11D09, 0x11D3A, 0x11D3C, 0x11D3D, 0x11D67, 0x11D68, 0x11D90, 0x11D91, 0x11FB0, 0x16FF0, 0x16FF1, 0x1AFFD, 0x1AFFE, 0x1B132, 0x1B155, 0x1D49E, 0x1D49F, 0x1D4A2, 0x1D4A5, 0x1D4A6, 0x1D4BB, 0x1D546, 0x1E023, 0x1E024, 0x1E08F, 0x1E14E, 0x1E14F, 0x1E2FF, 0x1E5FF, 0x1E7ED, 0x1E7EE, 0x1E95E, 0x1E95F, 0x1EE21, 0x1EE22, 0x1EE24, 0x1EE27, 0x1EE39, 0x1EE3B, 0x1EE42, 0x1EE47, 0x1EE49, 0x1EE4B, 0x1EE51, 0x1EE52, 0x1EE54, 0x1EE57, 0x1EE59, 0x1EE5B, 0x1EE5D, 0x1EE5F, 0x1EE61, 0x1EE62, 0x1EE64, 0x1EE7E, 0x1EEF0, 0x1EEF1, 0x1F250, 0x1F251, 0x1F7F0, 0x1F8C0, 0x1F8C1 #endif }; #define NUM_GRAPH_CHAR ((int)(sizeof(graphCharTable)/sizeof(chr))) /* * End of auto-generated Unicode character ranges declarations. |
︙ | ︙ |
Changes to generic/rege_dfa.c.
︙ | ︙ | |||
787 788 789 790 791 792 793 | } } /* * Nobody's old enough?!? -- something's really wrong. */ | | | 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 | } } /* * Nobody's old enough?!? -- something's really wrong. */ FDEBUG(("cannot find victim to replace!\n")); assert(NOTREACHED); ERR(REG_ASSERT); return d->ssets; } /* * Local Variables: |
︙ | ︙ |
Changes to generic/regerrs.h.
1 2 3 4 5 6 7 8 9 10 11 12 13 | { REG_OKAY, "REG_OKAY", "no errors detected" }, { REG_NOMATCH, "REG_NOMATCH", "failed to match" }, { REG_BADPAT, "REG_BADPAT", "invalid regexp (reg version 0.8)" }, { REG_ECOLLATE, "REG_ECOLLATE", "invalid collating element" }, { REG_ECTYPE, "REG_ECTYPE", "invalid character class" }, { REG_EESCAPE, "REG_EESCAPE", "invalid escape \\ sequence" }, { REG_ESUBREG, "REG_ESUBREG", "invalid backreference number" }, { REG_EBRACK, "REG_EBRACK", "brackets [] not balanced" }, { REG_EPAREN, "REG_EPAREN", "parentheses () not balanced" }, { REG_EBRACE, "REG_EBRACE", "braces {} not balanced" }, { REG_BADBR, "REG_BADBR", "invalid repetition count(s)" }, { REG_ERANGE, "REG_ERANGE", "invalid character range" }, { REG_ESPACE, "REG_ESPACE", "out of memory" }, | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | { REG_OKAY, "REG_OKAY", "no errors detected" }, { REG_NOMATCH, "REG_NOMATCH", "failed to match" }, { REG_BADPAT, "REG_BADPAT", "invalid regexp (reg version 0.8)" }, { REG_ECOLLATE, "REG_ECOLLATE", "invalid collating element" }, { REG_ECTYPE, "REG_ECTYPE", "invalid character class" }, { REG_EESCAPE, "REG_EESCAPE", "invalid escape \\ sequence" }, { REG_ESUBREG, "REG_ESUBREG", "invalid backreference number" }, { REG_EBRACK, "REG_EBRACK", "brackets [] not balanced" }, { REG_EPAREN, "REG_EPAREN", "parentheses () not balanced" }, { REG_EBRACE, "REG_EBRACE", "braces {} not balanced" }, { REG_BADBR, "REG_BADBR", "invalid repetition count(s)" }, { REG_ERANGE, "REG_ERANGE", "invalid character range" }, { REG_ESPACE, "REG_ESPACE", "out of memory" }, { REG_BADRPT, "REG_BADRPT", "invalid quantifier operand" }, { REG_ASSERT, "REG_ASSERT", "\"cannot happen\" -- you found a bug" }, { REG_INVARG, "REG_INVARG", "invalid argument to regex function" }, { REG_MIXED, "REG_MIXED", "character widths of regex and string differ" }, { REG_BADOPT, "REG_BADOPT", "invalid embedded option" }, { REG_ETOOBIG, "REG_ETOOBIG", "regular expression is too complex" }, { REG_ECOLORS, "REG_ECOLORS", "too many colors" }, |
Changes to generic/tcl.h.
︙ | ︙ | |||
49 50 51 52 53 54 55 | #if !defined(TCL_MAJOR_VERSION) # define TCL_MAJOR_VERSION 9 #endif #if TCL_MAJOR_VERSION == 9 # define TCL_MINOR_VERSION 0 # define TCL_RELEASE_LEVEL TCL_BETA_RELEASE | | | | 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | #if !defined(TCL_MAJOR_VERSION) # define TCL_MAJOR_VERSION 9 #endif #if TCL_MAJOR_VERSION == 9 # define TCL_MINOR_VERSION 0 # define TCL_RELEASE_LEVEL TCL_BETA_RELEASE # define TCL_RELEASE_SERIAL 4 # define TCL_VERSION "9.0" # define TCL_PATCH_LEVEL "9.0b4" #endif /* TCL_MAJOR_VERSION */ #if defined(RC_INVOKED) /* * Utility macros: STRINGIFY takes an argument and wraps it in "" (double * quotation marks), JOIN joins two arguments. */ |
︙ | ︙ | |||
450 451 452 453 454 455 456 | #define TCL_REG_CANMATCH 001000 /* Report details on partial/limited * matches. */ /* * Flags values passed to Tcl_RegExpExecObj. */ | | | 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 | #define TCL_REG_CANMATCH 001000 /* Report details on partial/limited * matches. */ /* * Flags values passed to Tcl_RegExpExecObj. */ #define TCL_REG_NOTBOL 0001 /* Beginning of string does not match ^. */ #define TCL_REG_NOTEOL 0002 /* End of string does not match $. */ /* * Structures filled in by Tcl_RegExpInfo. Note that all offset values are * relative to the start of the match string, not the beginning of the entire * string. */ |
︙ | ︙ | |||
665 666 667 668 669 670 671 | /* Called to update the string rep from the * type's internal representation. */ Tcl_SetFromAnyProc *setFromAnyProc; /* Called to convert the object's internal rep * to this type. Frees the internal rep of the * old type. Returns TCL_ERROR on failure. */ #if TCL_MAJOR_VERSION > 8 | | | 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 | /* Called to update the string rep from the * type's internal representation. */ Tcl_SetFromAnyProc *setFromAnyProc; /* Called to convert the object's internal rep * to this type. Frees the internal rep of the * old type. Returns TCL_ERROR on failure. */ #if TCL_MAJOR_VERSION > 8 size_t version; /* Version field for future-proofing. */ /* List emulation functions - ObjType Version 1 */ Tcl_ObjTypeLengthProc *lengthProc; /* Return the [llength] of the AbstractList */ Tcl_ObjTypeIndexProc *indexProc; /* Return a value (Tcl_Obj) at a given index */ Tcl_ObjTypeSliceProc *sliceProc; |
︙ | ︙ | |||
700 701 702 703 704 705 706 707 708 709 710 711 712 713 | 0,0,0,0,0,0,0,0 /* Pre-Tcl 9 */ # define TCL_OBJTYPE_V1(a) offsetof(Tcl_ObjType, indexProc), \ a,0,0,0,0,0,0,0 /* Tcl 9 Version 1 */ # define TCL_OBJTYPE_V2(a,b,c,d,e,f,g,h) sizeof(Tcl_ObjType), \ a,b,c,d,e,f,g,h /* Tcl 9 - AbstractLists */ #else # define TCL_OBJTYPE_V0 /* just empty */ #endif /* * The following structure stores an internal representation (internalrep) for * a Tcl value. An internalrep is associated with an Tcl_ObjType when both * are stored in the same Tcl_Obj. The routines of the Tcl_ObjType govern * the handling of the internalrep. | > > | 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 | 0,0,0,0,0,0,0,0 /* Pre-Tcl 9 */ # define TCL_OBJTYPE_V1(a) offsetof(Tcl_ObjType, indexProc), \ a,0,0,0,0,0,0,0 /* Tcl 9 Version 1 */ # define TCL_OBJTYPE_V2(a,b,c,d,e,f,g,h) sizeof(Tcl_ObjType), \ a,b,c,d,e,f,g,h /* Tcl 9 - AbstractLists */ #else # define TCL_OBJTYPE_V0 /* just empty */ # define TCL_OBJTYPE_V1(a) /* just empty */ # define TCL_OBJTYPE_V2(a,b,c,d,e,f,g,h) /* just empty */ #endif /* * The following structure stores an internal representation (internalrep) for * a Tcl value. An internalrep is associated with an Tcl_ObjType when both * are stored in the same Tcl_Obj. The routines of the Tcl_ObjType govern * the handling of the internalrep. |
︙ | ︙ | |||
803 804 805 806 807 808 809 | * declared as "dummyX". * * WARNING!! The structure definition must be kept consistent with the * CallFrame structure in tclInt.h. If you change one, change the other. */ typedef struct Tcl_CallFrame { | | | 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 | * declared as "dummyX". * * WARNING!! The structure definition must be kept consistent with the * CallFrame structure in tclInt.h. If you change one, change the other. */ typedef struct Tcl_CallFrame { Tcl_Namespace *nsPtr; /* Current namespace for the call frame. */ int dummy1; Tcl_Size dummy2; void *dummy3; void *dummy4; void *dummy5; Tcl_Size dummy6; void *dummy7; |
︙ | ︙ | |||
1288 1289 1290 1291 1292 1293 1294 | /* * Positions to pass to Tcl_QueueEvent/Tcl_ThreadQueueEvent: */ typedef enum { TCL_QUEUE_TAIL, TCL_QUEUE_HEAD, TCL_QUEUE_MARK, | | | 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 | /* * Positions to pass to Tcl_QueueEvent/Tcl_ThreadQueueEvent: */ typedef enum { TCL_QUEUE_TAIL, TCL_QUEUE_HEAD, TCL_QUEUE_MARK, TCL_QUEUE_ALERT_IF_EMPTY=4 } Tcl_QueuePosition; /* * Values to pass to Tcl_SetServiceMode to specify the behavior of notifier * event routines. */ |
︙ | ︙ | |||
1684 1685 1686 1687 1688 1689 1690 | * arbitrary additional data to files in a * filesystem. */ Tcl_FSFileAttrsGetProc *fileAttrsGetProc; /* Called by 'Tcl_FSFileAttrsGet()' and by * 'file attributes'. */ Tcl_FSFileAttrsSetProc *fileAttrsSetProc; /* Called by 'Tcl_FSFileAttrsSet()' and by | | | 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 | * arbitrary additional data to files in a * filesystem. */ Tcl_FSFileAttrsGetProc *fileAttrsGetProc; /* Called by 'Tcl_FSFileAttrsGet()' and by * 'file attributes'. */ Tcl_FSFileAttrsSetProc *fileAttrsSetProc; /* Called by 'Tcl_FSFileAttrsSet()' and by * 'file attributes'. */ Tcl_FSCreateDirectoryProc *createDirectoryProc; /* Called by 'Tcl_FSCreateDirectory()'. May be * NULL if the filesystem is read-only. */ Tcl_FSRemoveDirectoryProc *removeDirectoryProc; /* Called by 'Tcl_FSRemoveDirectory()'. May be * NULL if the filesystem is read-only. */ Tcl_FSDeleteFileProc *deleteFileProc; |
︙ | ︙ | |||
1965 1966 1967 1968 1969 1970 1971 | * encoding type. */ Tcl_EncodingConvertProc *toUtfProc; /* Function to convert from external encoding * into UTF-8. */ Tcl_EncodingConvertProc *fromUtfProc; /* Function to convert from UTF-8 into * external encoding. */ | | < | 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 | * encoding type. */ Tcl_EncodingConvertProc *toUtfProc; /* Function to convert from external encoding * into UTF-8. */ Tcl_EncodingConvertProc *fromUtfProc; /* Function to convert from UTF-8 into * external encoding. */ Tcl_FreeProc *freeProc; /* If non-NULL, function to call when this * encoding is deleted. */ void *clientData; /* Arbitrary value associated with encoding * type. Passed to conversion functions. */ Tcl_Size nullSize; /* Number of zero bytes that signify * end-of-string in this encoding. This number * is used to determine the source string * length when the srcLen argument is |
︙ | ︙ | |||
2327 2328 2329 2330 2331 2332 2333 | # if TCL_UTF_MAX < 4 # define Tcl_InitStubs(interp, version, exact) \ (Tcl_InitStubs)(interp, version, \ (exact)|(TCL_MAJOR_VERSION<<8)|(0xFF<<16), \ TCL_STUB_MAGIC) # else # define Tcl_InitStubs(interp, version, exact) \ | | | > > | | 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 | # if TCL_UTF_MAX < 4 # define Tcl_InitStubs(interp, version, exact) \ (Tcl_InitStubs)(interp, version, \ (exact)|(TCL_MAJOR_VERSION<<8)|(0xFF<<16), \ TCL_STUB_MAGIC) # else # define Tcl_InitStubs(interp, version, exact) \ (Tcl_InitStubs)(interp, "8.7b1", \ (exact)|(TCL_MAJOR_VERSION<<8)|(0xFF<<16), \ TCL_STUB_MAGIC) # endif #elif TCL_RELEASE_LEVEL == TCL_FINAL_RELEASE # define Tcl_InitStubs(interp, version, exact) \ (Tcl_InitStubs)(interp, version, \ (exact)|(TCL_MAJOR_VERSION<<8)|(TCL_MINOR_VERSION<<16), \ TCL_STUB_MAGIC) #else # define Tcl_InitStubs(interp, version, exact) \ (Tcl_InitStubs)(interp, (((exact)&1) ? (version) : "9.0b3"), \ (exact)|(TCL_MAJOR_VERSION<<8)|(TCL_MINOR_VERSION<<16), \ TCL_STUB_MAGIC) #endif #else #if TCL_MAJOR_VERSION < 9 # define Tcl_InitStubs(interp, version, exact) \ Tcl_Panic(((void)interp, (void)version, \ (void)exact, "Please define -DUSE_TCL_STUBS")) #elif TCL_RELEASE_LEVEL == TCL_FINAL_RELEASE # define Tcl_InitStubs(interp, version, exact) \ Tcl_PkgInitStubsCheck(interp, version, \ (exact)|(TCL_MAJOR_VERSION<<8)|(TCL_MINOR_VERSION<<16)) #else # define Tcl_InitStubs(interp, version, exact) \ Tcl_PkgInitStubsCheck(interp, TCL_PATCH_LEVEL, \ |
︙ | ︙ |
Changes to generic/tclBasic.c.
︙ | ︙ | |||
459 460 461 462 463 464 465 | {"info", "cmdtype"}, {"info", "nameofexecutable"}, /* [tcl::process] has ONLY unsafe commands! */ {"process", "list"}, {"process", "status"}, {"process", "purge"}, {"process", "autopurge"}, | > > > > | > > > > | > | 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 | {"info", "cmdtype"}, {"info", "nameofexecutable"}, /* [tcl::process] has ONLY unsafe commands! */ {"process", "list"}, {"process", "status"}, {"process", "purge"}, {"process", "autopurge"}, /* * [zipfs] perhaps has some safe commands. But like file make it inaccessible * until they are analyzed to be safe. */ {"zipfs", NULL}, {"zipfs", "canonical"}, {"zipfs", "exists"}, {"zipfs", "info"}, {"zipfs", "list"}, {"zipfs", "lmkimg"}, {"zipfs", "lmkzip"}, {"zipfs", "mkimg"}, {"zipfs", "mkkey"}, {"zipfs", "mkzip"}, {"zipfs", "mount"}, {"zipfs", "mountdata"}, {"zipfs", "root"}, {"zipfs", "unmount"}, {NULL, NULL} }; /* * Math functions. All are safe. */ |
︙ | ︙ | |||
1236 1237 1238 1239 1240 1241 1242 | /* * Register the mathematical "operator" commands. [TIP #174] */ nsPtr = Tcl_CreateNamespace(interp, "::tcl::mathop", NULL, NULL); if (nsPtr == NULL) { | | | 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 | /* * Register the mathematical "operator" commands. [TIP #174] */ nsPtr = Tcl_CreateNamespace(interp, "::tcl::mathop", NULL, NULL); if (nsPtr == NULL) { Tcl_Panic("cannot create math operator namespace"); } Tcl_Export(interp, nsPtr, "*", 1); #define MATH_OP_PREFIX_LEN 15 /* == strlen("::tcl::mathop::") */ memcpy(mathFuncName, "::tcl::mathop::", MATH_OP_PREFIX_LEN); for (opcmdInfoPtr=mathOpCmds ; opcmdInfoPtr->name!=NULL ; opcmdInfoPtr++){ TclOpCmdClientData *occdPtr = (TclOpCmdClientData *)Tcl_Alloc(sizeof(TclOpCmdClientData)); |
︙ | ︙ | |||
8857 8858 8859 8860 8861 8862 8863 | /* * Create the callback to actually evaluate the tailcalled * command, then set it in the varFrame so that PopCallFrame can use it * at the proper time. */ if (objc > 1) { | | < | | 8866 8867 8868 8869 8870 8871 8872 8873 8874 8875 8876 8877 8878 8879 8880 8881 8882 8883 8884 8885 8886 8887 8888 8889 | /* * Create the callback to actually evaluate the tailcalled * command, then set it in the varFrame so that PopCallFrame can use it * at the proper time. */ if (objc > 1) { Tcl_Obj *listPtr; Tcl_Namespace *nsPtr = (Tcl_Namespace *) iPtr->varFramePtr->nsPtr; /* * The tailcall data is in a Tcl list: the first element is the * namespace, the rest the command to be tailcalled. */ listPtr = Tcl_NewListObj(objc, objv); TclListObjSetElement(NULL, listPtr, 0, TclNewNamespaceObj(nsPtr)); iPtr->varFramePtr->tailcallPtr = listPtr; } return TCL_RETURN; } /* |
︙ | ︙ | |||
9020 9021 9022 9023 9024 9025 9026 | TclNRYieldToObjCmd( TCL_UNUSED(void *), Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) { CoroutineData *corPtr = iPtr->execEnvPtr->corPtr; | < > | 9028 9029 9030 9031 9032 9033 9034 9035 9036 9037 9038 9039 9040 9041 9042 9043 | TclNRYieldToObjCmd( TCL_UNUSED(void *), Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) { CoroutineData *corPtr = iPtr->execEnvPtr->corPtr; Tcl_Namespace *nsPtr = TclGetCurrentNamespace(interp); Tcl_Obj *listPtr; if (objc < 2) { Tcl_WrongNumArgs(interp, 1, objv, "command ?arg ...?"); return TCL_ERROR; } if (!corPtr) { |
︙ | ︙ | |||
9050 9051 9052 9053 9054 9055 9056 | /* * Add the tailcall in the caller env, then just yield. * * This is essentially code from TclNRTailcallObjCmd */ listPtr = Tcl_NewListObj(objc, objv); | < | | 9058 9059 9060 9061 9062 9063 9064 9065 9066 9067 9068 9069 9070 9071 9072 | /* * Add the tailcall in the caller env, then just yield. * * This is essentially code from TclNRTailcallObjCmd */ listPtr = Tcl_NewListObj(objc, objv); TclListObjSetElement(NULL, listPtr, 0, TclNewNamespaceObj(nsPtr)); /* * Add the callback in the caller's env, then instruct TEBC to yield. */ iPtr->execEnvPtr = corPtr->callerEEPtr; /* Not calling Tcl_IncrRefCount(listPtr) here because listPtr is private */ |
︙ | ︙ | |||
9745 9746 9747 9748 9749 9750 9751 | corPtr->cmdPtr = cmdPtr; cmdPtr->refCount++; /* * #280. * Provide the new coroutine with its own copy of the lineLABCPtr | | | 9752 9753 9754 9755 9756 9757 9758 9759 9760 9761 9762 9763 9764 9765 9766 | corPtr->cmdPtr = cmdPtr; cmdPtr->refCount++; /* * #280. * Provide the new coroutine with its own copy of the lineLABCPtr * hashtable for literal command arguments in bytecode. Note that * CFWordBC chains are not duplicated, only the entrypoints to them. This * means that in the presence of coroutines each chain is potentially a * tree. Like the chain -> tree conversion of the CmdFrame stack. */ { Tcl_HashSearch hSearch; |
︙ | ︙ |
Changes to generic/tclBinary.c.
︙ | ︙ | |||
2395 2396 2397 2398 2399 2400 2401 | } /* * ---------------------------------------------------------------------- * * NOTES -- * | | | 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 | } /* * ---------------------------------------------------------------------- * * NOTES -- * * Some measurements show that it is faster to use a table to perform * uuencode and base64 value encoding than to calculate the output (at * least on intel P4 arch). * * Conversely using a lookup table for the decoding is slower than just * calculating the values. We therefore use the fastest of each method. * * Presumably this has to do with the size of the tables. The base64 |
︙ | ︙ |
Changes to generic/tclCkalloc.c.
︙ | ︙ | |||
1270 1271 1272 1273 1274 1275 1276 | /* *------------------------------------------------------------------------ * * TclAttemptReallocElemsEx -- * * Attempts to allocate (oldPtr == NULL) or reallocate memory of the * requested size plus some more for future growth. The amount of | | | 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 | /* *------------------------------------------------------------------------ * * TclAttemptReallocElemsEx -- * * Attempts to allocate (oldPtr == NULL) or reallocate memory of the * requested size plus some more for future growth. The amount of * reallocation is adjusted depending on failure. * * * Results: * Pointer to allocated memory block which is at least as large * as the requested size or NULL if allocation failed. * *------------------------------------------------------------------------ |
︙ | ︙ |
Changes to generic/tclClock.c.
︙ | ︙ | |||
3413 3414 3415 3416 3417 3418 3419 | } /* Base (by scan or add) or clock value (by format) */ if (opts->baseObj != NULL) { Tcl_Obj *baseObj = opts->baseObj; | | > > | | | | | > > | 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 | } /* Base (by scan or add) or clock value (by format) */ if (opts->baseObj != NULL) { Tcl_Obj *baseObj = opts->baseObj; /* bypass integer recognition if looks like "now" or "-now" */ if ((baseObj->bytes && ((baseObj->length == 3 && baseObj->bytes[0] == 'n') || (baseObj->length == 4 && baseObj->bytes[1] == 'n'))) || TclGetWideIntFromObj(NULL, baseObj, &baseVal) != TCL_OK) { /* we accept "now" and "-now" as current date-time */ static const char *const nowOpts[] = { "now", "-now", NULL }; int idx; if (Tcl_GetIndexFromObj(NULL, baseObj, nowOpts, "seconds", TCL_EXACT, &idx) == TCL_OK) { goto baseNow; } if (TclHasInternalRep(baseObj, &tclBignumType)) { goto baseOverflow; } Tcl_SetObjResult(interp, Tcl_ObjPrintf( "bad seconds \"%s\": must be now or integer", TclGetString(baseObj))); i = baseIdx; goto badOption; } /* * Seconds could be an unsigned number that overflowed. Make sure * that it isn't. Additionally it may be too complex to calculate * julianday etc (forwards/backwards) by too large/small values, thus |
︙ | ︙ | |||
3523 3524 3525 3526 3527 3528 3529 | ClockFormatObjCmd( void *clientData, /* Client data containing literal pool */ Tcl_Interp *interp, /* Tcl interpreter */ int objc, /* Parameter count */ Tcl_Obj *const objv[]) /* Parameter values */ { ClockClientData *dataPtr = (ClockClientData *)clientData; | | | 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 | ClockFormatObjCmd( void *clientData, /* Client data containing literal pool */ Tcl_Interp *interp, /* Tcl interpreter */ int objc, /* Parameter count */ Tcl_Obj *const objv[]) /* Parameter values */ { ClockClientData *dataPtr = (ClockClientData *)clientData; static const char *syntax = "clock format clockval|now " "?-format string? " "?-gmt boolean? " "?-locale LOCALE? ?-timezone ZONE?"; int ret; ClockFmtScnCmdArgs opts; /* Format, locale, timezone and base */ DateFormat dateFmt; /* Common structure used for formatting */ |
︙ | ︙ | |||
3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 | if (curJDN > opts->dataPtr->maxJDN) { Tcl_SetObjResult(opts->interp, Tcl_NewStringObj( "requested date too large to represent", TCL_AUTO_LENGTH)); Tcl_SetErrorCode(opts->interp, "CLOCK", "dateTooLarge", (char *)NULL); return TCL_ERROR; } } /* Local seconds to UTC (stored in yydate.seconds) */ if (info->flags & CLF_ASSEMBLE_SECONDS) { yydate.localSeconds = -210866803200LL + (SECONDS_PER_DAY * yydate.julianDay) | > > > > > > | | 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 | if (curJDN > opts->dataPtr->maxJDN) { Tcl_SetObjResult(opts->interp, Tcl_NewStringObj( "requested date too large to represent", TCL_AUTO_LENGTH)); Tcl_SetErrorCode(opts->interp, "CLOCK", "dateTooLarge", (char *)NULL); return TCL_ERROR; } } /* If seconds overflows the day (no validate case), increase days */ if (yySecondOfDay >= SECONDS_PER_DAY) { yydate.julianDay += (yySecondOfDay / SECONDS_PER_DAY); yySecondOfDay %= SECONDS_PER_DAY; } /* Local seconds to UTC (stored in yydate.seconds) */ if (info->flags & CLF_ASSEMBLE_SECONDS) { yydate.localSeconds = -210866803200LL + (SECONDS_PER_DAY * yydate.julianDay) + yySecondOfDay; } if (info->flags & (CLF_ASSEMBLE_SECONDS | CLF_LOCALSEC)) { if (ConvertLocalToUTC(opts->dataPtr, opts->interp, &yydate, opts->timezoneObj, GREGORIAN_CHANGE_DATE) != TCL_OK) { return TCL_ERROR; } |
︙ | ︙ | |||
4348 4349 4350 4351 4352 4353 4354 | int ClockAddObjCmd( void *clientData, /* Client data containing literal pool */ Tcl_Interp *interp, /* Tcl interpreter */ int objc, /* Parameter count */ Tcl_Obj *const objv[]) /* Parameter values */ { | | | 4358 4359 4360 4361 4362 4363 4364 4365 4366 4367 4368 4369 4370 4371 4372 | int ClockAddObjCmd( void *clientData, /* Client data containing literal pool */ Tcl_Interp *interp, /* Tcl interpreter */ int objc, /* Parameter count */ Tcl_Obj *const objv[]) /* Parameter values */ { static const char *syntax = "clock add clockval|now ?number units?..." "?-gmt boolean? " "?-locale LOCALE? ?-timezone ZONE?"; ClockClientData *dataPtr = (ClockClientData *)clientData; int ret; ClockFmtScnCmdArgs opts; /* Format, locale, timezone and base */ DateInfo yy; /* Common structure used for parsing */ DateInfo *info = &yy; |
︙ | ︙ |
Changes to generic/tclClockFmt.c.
︙ | ︙ | |||
109 110 111 112 113 114 115 | if (sign < 0) { val = -val; } *out = val; } /* int & Tcl_WideInt overflows may happens here (expected case) */ | | | 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 | if (sign < 0) { val = -val; } *out = val; } /* int & Tcl_WideInt overflows may happens here (expected case) */ #if (defined(__GNUC__) || defined(__GNUG__)) && !defined(__clang__) # pragma GCC optimize("no-trapv") #endif static inline int Clock_str2int( int *out, const char *p, |
︙ | ︙ | |||
205 206 207 208 209 210 211 | const char *p, const char *e, int sign) { return Clock_str2wideInt(out, p, e, sign); } | | | 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 | const char *p, const char *e, int sign) { return Clock_str2wideInt(out, p, e, sign); } #if (defined(__GNUC__) || defined(__GNUG__)) && !defined(__clang__) # pragma GCC reset_options #endif /* *---------------------------------------------------------------------- * * Clock_itoaw, Clock_witoaw -- |
︙ | ︙ | |||
1789 1790 1791 1792 1793 1794 1795 | /* * Build a date from julian day (integer and fraction). * Note, astronomical JDN starts at noon in opposite to calendar julianday. */ fractJD = (int)tok->map->offs /* 0 for calendar or 43200 for astro JD */ + (int)((Tcl_WideInt)SECONDS_PER_DAY * fractJD / fractJDDiv); | | | 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 | /* * Build a date from julian day (integer and fraction). * Note, astronomical JDN starts at noon in opposite to calendar julianday. */ fractJD = (int)tok->map->offs /* 0 for calendar or 43200 for astro JD */ + (int)((Tcl_WideInt)SECONDS_PER_DAY * fractJD / fractJDDiv); if (fractJD >= SECONDS_PER_DAY) { fractJD %= SECONDS_PER_DAY; intJD += 1; } yydate.secondOfDay = fractJD; yydate.julianDay = intJD; yydate.seconds = |
︙ | ︙ |
Changes to generic/tclCmdIL.c.
︙ | ︙ | |||
1702 1703 1704 1705 1706 1707 1708 | static int InfoLoadedCmd( TCL_UNUSED(void *), Tcl_Interp *interp, /* Current interpreter. */ int objc, /* Number of arguments. */ Tcl_Obj *const objv[]) /* Argument objects. */ { | | | | | | | 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 | static int InfoLoadedCmd( TCL_UNUSED(void *), Tcl_Interp *interp, /* Current interpreter. */ int objc, /* Number of arguments. */ Tcl_Obj *const objv[]) /* Argument objects. */ { const char *interpName, *prefix; if (objc > 3) { Tcl_WrongNumArgs(interp, 1, objv, "?interp? ?prefix?"); return TCL_ERROR; } if (objc < 2) { /* Get loaded pkgs in all interpreters. */ interpName = NULL; } else { /* Get pkgs just in specified interp. */ interpName = TclGetString(objv[1]); } if (objc < 3) { /* Get loaded files in all packages. */ prefix = NULL; } else { /* Get pkgs just in specified interp. */ prefix = TclGetString(objv[2]); } return TclGetLoadedLibraries(interp, interpName, prefix); } /* *---------------------------------------------------------------------- * * InfoNameOfExecutableCmd -- * |
︙ | ︙ | |||
2291 2292 2293 2294 2295 2296 2297 | Tcl_Obj *elemObj; if (Tcl_ListObjIndex(interp, listPtr, i, &elemObj) != TCL_OK) { return TCL_ERROR; } /* * Must incrref elemObj. If the var name being set is same as the | | | 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 | Tcl_Obj *elemObj; if (Tcl_ListObjIndex(interp, listPtr, i, &elemObj) != TCL_OK) { return TCL_ERROR; } /* * Must incrref elemObj. If the var name being set is same as the * list value, ObjSetVar2 will shimmer the list to a VAR freeing * the elements in the list (in case list refCount was 1) BEFORE * the elemObj is stored in the var. See tests 6.{25,26} */ Tcl_IncrRefCount(elemObj); if (Tcl_ObjSetVar2(interp, *objv++, NULL, elemObj, TCL_LEAVE_ERR_MSG) == NULL) { Tcl_DecrRefCount(elemObj); |
︙ | ︙ | |||
4135 4136 4137 4138 4139 4140 4141 | Tcl_Obj *const objv[]) /* The argument objects. */ { Tcl_Obj *elementCount = NULL; Tcl_Obj *start = NULL, *end = NULL, *step = NULL; Tcl_WideInt values[5]; Tcl_Obj *numValues[5]; Tcl_Obj *numberObj; | | > | 4135 4136 4137 4138 4139 4140 4141 4142 4143 4144 4145 4146 4147 4148 4149 4150 | Tcl_Obj *const objv[]) /* The argument objects. */ { Tcl_Obj *elementCount = NULL; Tcl_Obj *start = NULL, *end = NULL, *step = NULL; Tcl_WideInt values[5]; Tcl_Obj *numValues[5]; Tcl_Obj *numberObj; int status = TCL_ERROR, keyword, allowedArgs = NumericArg; int useDoubles = 0; int remNums = 3; Tcl_Obj *arithSeriesPtr; SequenceOperators opmode; SequenceDecoded decoded; int i, arg_key = 0, value_i = 0; /* Default constants */ #define zero ((Interp *)interp)->execEnvPtr->constants[0]; |
︙ | ︙ | |||
4180 4181 4182 4183 4184 4185 4186 | allowedArgs = RangeKeywordArg; /* if last number but 2 arguments remain, next is not numeric */ if ((remNums != 1) || ((objc-1-i) != 2)) { allowedArgs |= NumericArg; } numValues[value_i] = numberObj; values[value_i] = keyword; /* TCL_NUMBER_* */ | | | 4181 4182 4183 4184 4185 4186 4187 4188 4189 4190 4191 4192 4193 4194 4195 | allowedArgs = RangeKeywordArg; /* if last number but 2 arguments remain, next is not numeric */ if ((remNums != 1) || ((objc-1-i) != 2)) { allowedArgs |= NumericArg; } numValues[value_i] = numberObj; values[value_i] = keyword; /* TCL_NUMBER_* */ useDoubles += (keyword == TCL_NUMBER_DOUBLE) ? 1 : 0; value_i++; break; case RangeKeywordArg: arg_key += RangeKeywordArg; allowedArgs = NumericArg; /* after keyword always numeric only */ values[value_i] = keyword; /* SequenceOperators */ |
︙ | ︙ | |||
4209 4210 4211 4212 4213 4214 4215 4216 4217 4218 4219 4220 4221 4222 | /* lseq n */ case 1: start = zero; elementCount = numValues[0]; end = NULL; step = one; break; /* lseq n n */ case 11: start = numValues[0]; end = numValues[1]; break; | > > > > | 4210 4211 4212 4213 4214 4215 4216 4217 4218 4219 4220 4221 4222 4223 4224 4225 4226 4227 | /* lseq n */ case 1: start = zero; elementCount = numValues[0]; end = NULL; step = one; useDoubles = 0; // Can only have Integer value. If a fractional value // is given, this will fail later. In other words, // "3.0" is allowed and used as Integer, but "3.1" // will be flagged as an error. (bug f4a4bd7f1070) break; /* lseq n n */ case 11: start = numValues[0]; end = numValues[1]; break; |
︙ | ︙ | |||
4335 4336 4337 4338 4339 4340 4341 4342 4343 4344 4345 4346 4347 4348 | goto done; break; } /* Count needs to be integer, so try to convert if possible */ if (elementCount && TclHasInternalRep(elementCount, &tclDoubleType)) { double d; (void)Tcl_GetDoubleFromObj(NULL, elementCount, &d); if (floor(d) == d) { if ((d >= (double)WIDE_MAX) || (d <= (double)WIDE_MIN)) { mp_int big; if (Tcl_InitBignumFromDouble(NULL, d, &big) == TCL_OK) { elementCount = Tcl_NewBignumObj(&big); | > > | 4340 4341 4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 4354 4355 | goto done; break; } /* Count needs to be integer, so try to convert if possible */ if (elementCount && TclHasInternalRep(elementCount, &tclDoubleType)) { double d; // Don't consider Count type to indicate using double values in seqence useDoubles -= (useDoubles > 0) ? 1 : 0; (void)Tcl_GetDoubleFromObj(NULL, elementCount, &d); if (floor(d) == d) { if ((d >= (double)WIDE_MAX) || (d <= (double)WIDE_MIN)) { mp_int big; if (Tcl_InitBignumFromDouble(NULL, d, &big) == TCL_OK) { elementCount = Tcl_NewBignumObj(&big); |
︙ | ︙ |
Changes to generic/tclCmdMZ.c.
︙ | ︙ | |||
4957 4958 4959 4960 4961 4962 4963 | &bits2) != TCL_OK) { continue; } if (len2 < len1) { continue; } for (j=0 ; j<len1 ; j++) { | | | | 4957 4958 4959 4960 4961 4962 4963 4964 4965 4966 4967 4968 4969 4970 4971 4972 | &bits2) != TCL_OK) { continue; } if (len2 < len1) { continue; } for (j=0 ; j<len1 ; j++) { if (TclStringCmp(bits1[j], bits2[j], 1, 0, TCL_INDEX_NONE) != 0) { /* * Really want 'continue outerloop;', but C does * not give us that. */ goto didNotMatch; } |
︙ | ︙ |
Changes to generic/tclCompCmdsGR.c.
︙ | ︙ | |||
472 473 474 475 476 477 478 | Tcl_Parse *parsePtr, /* Points to a parse structure for the command * created by Tcl_ParseCommand. */ TCL_UNUSED(Command *), CompileEnv *envPtr) /* Holds resulting instructions. */ { DefineLineInformation; /* TIP #280 */ Tcl_Token *varTokenPtr, *incrTokenPtr; | | > | 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 | Tcl_Parse *parsePtr, /* Points to a parse structure for the command * created by Tcl_ParseCommand. */ TCL_UNUSED(Command *), CompileEnv *envPtr) /* Holds resulting instructions. */ { DefineLineInformation; /* TIP #280 */ Tcl_Token *varTokenPtr, *incrTokenPtr; int isScalar, localIndex, haveImmValue; Tcl_WideInt immValue; if ((parsePtr->numWords != 2) && (parsePtr->numWords != 3)) { return TCL_ERROR; } varTokenPtr = TokenAfter(parsePtr->tokenPtr); |
︙ | ︙ | |||
499 500 501 502 503 504 505 | if (incrTokenPtr->type == TCL_TOKEN_SIMPLE_WORD) { const char *word = incrTokenPtr[1].start; size_t numBytes = incrTokenPtr[1].size; int code; Tcl_Obj *intObj = Tcl_NewStringObj(word, numBytes); Tcl_IncrRefCount(intObj); | | < > | 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 | if (incrTokenPtr->type == TCL_TOKEN_SIMPLE_WORD) { const char *word = incrTokenPtr[1].start; size_t numBytes = incrTokenPtr[1].size; int code; Tcl_Obj *intObj = Tcl_NewStringObj(word, numBytes); Tcl_IncrRefCount(intObj); code = TclGetWideIntFromObj(NULL, intObj, &immValue); if ((code == TCL_OK) && (-127 <= immValue) && (immValue <= 127)) { haveImmValue = 1; } TclDecrRefCount(intObj); if (!haveImmValue) { PushLiteral(envPtr, word, numBytes); } } else { SetLineInformation(2); CompileTokens(envPtr, incrTokenPtr, interp); } |
︙ | ︙ |
Changes to generic/tclCompile.c.
︙ | ︙ | |||
2489 2490 2491 2492 2493 2494 2495 | * script). We may have to extend the table of locations. * * The continuation line information is relevant even if the word * being processed is not a literal, as it can affect nested * commands. See the branch below for TCL_TOKEN_COMMAND, where the * adjustment being tracked here is taken into account. The good * thing is a table of everything is not needed, just the number of | | | 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 | * script). We may have to extend the table of locations. * * The continuation line information is relevant even if the word * being processed is not a literal, as it can affect nested * commands. See the branch below for TCL_TOKEN_COMMAND, where the * adjustment being tracked here is taken into account. The good * thing is a table of everything is not needed, just the number of * lines to add as correction. */ if ((length == 1) && (buffer[0] == ' ') && (tokenPtr->start[1] == '\n')) { if (isLiteral) { int clPos = Tcl_DStringLength(&textBuffer); |
︙ | ︙ | |||
2684 2685 2686 2687 2688 2689 2690 | *---------------------------------------------------------------------- */ void TclCompileExprWords( Tcl_Interp *interp, /* Used for error and status reporting. */ Tcl_Token *tokenPtr, /* Points to first in an array of word tokens | | < | 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 | *---------------------------------------------------------------------- */ void TclCompileExprWords( Tcl_Interp *interp, /* Used for error and status reporting. */ Tcl_Token *tokenPtr, /* Points to first in an array of word tokens * for the expression to compile inline. */ size_t numWords1, /* Number of word tokens starting at tokenPtr. * Must be at least 1. Each word token * contains one or more subtokens. */ CompileEnv *envPtr) /* Holds the resulting instructions. */ { Tcl_Token *wordPtr; int i, concatItems; |
︙ | ︙ |
Changes to generic/tclDate.c.
︙ | ︙ | |||
65 66 67 68 69 70 71 72 73 74 75 76 77 78 | /* Substitute the variable and function names. */ #define yyparse TclDateparse #define yylex TclDatelex #define yyerror TclDateerror #define yydebug TclDatedebug /* First part of user prologue. */ /* * tclDate.c -- * * This file is generated from a yacc grammar defined in the file | > | 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | /* Substitute the variable and function names. */ #define yyparse TclDateparse #define yylex TclDatelex #define yyerror TclDateerror #define yydebug TclDatedebug #define yynerrs TclDatenerrs /* First part of user prologue. */ /* * tclDate.c -- * * This file is generated from a yacc grammar defined in the file |
︙ | ︙ | |||
1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 | /* Location data for the lookahead symbol. */ static YYLTYPE yyloc_default # if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL = { 1, 1, 1, 1 } # endif ; YYLTYPE yylloc = yyloc_default; yy_state_fast_t yystate = 0; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus = 0; /* Refer to the stacks through separate pointers, to allow yyoverflow to reallocate them elsewhere. */ | > > > | 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 | /* Location data for the lookahead symbol. */ static YYLTYPE yyloc_default # if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL = { 1, 1, 1, 1 } # endif ; YYLTYPE yylloc = yyloc_default; /* Number of syntax errors so far. */ int yynerrs = 0; yy_state_fast_t yystate = 0; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus = 0; /* Refer to the stacks through separate pointers, to allow yyoverflow to reallocate them elsewhere. */ |
︙ | ︙ | |||
1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 | yyerrlab: /* Make sure we have latest lookahead translation. See comments at user semantic actions for why this is necessary. */ yytoken = yychar == YYEMPTY ? YYSYMBOL_YYEMPTY : YYTRANSLATE (yychar); /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { yyerror (&yylloc, info, YY_("syntax error")); } yyerror_range[1] = yylloc; if (yyerrstatus == 3) { /* If just tried and failed to reuse lookahead token after an | > | 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 | yyerrlab: /* Make sure we have latest lookahead translation. See comments at user semantic actions for why this is necessary. */ yytoken = yychar == YYEMPTY ? YYSYMBOL_YYEMPTY : YYTRANSLATE (yychar); /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { ++yynerrs; yyerror (&yylloc, info, YY_("syntax error")); } yyerror_range[1] = yylloc; if (yyerrstatus == 3) { /* If just tried and failed to reuse lookahead token after an |
︙ | ︙ | |||
1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 | | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: /* Pacify compilers when the user code never invokes YYERROR and the label yyerrorlab therefore never appears in user code. */ if (0) YYERROR; /* Do not reclaim the symbols of the rule whose action triggered this YYERROR. */ YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); yystate = *yyssp; | > | 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 | | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: /* Pacify compilers when the user code never invokes YYERROR and the label yyerrorlab therefore never appears in user code. */ if (0) YYERROR; ++yynerrs; /* Do not reclaim the symbols of the rule whose action triggered this YYERROR. */ YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); yystate = *yyssp; |
︙ | ︙ | |||
2116 2117 2118 2119 2120 2121 2122 | { "july", tMONTH, 7 }, { "august", tMONTH, 8 }, { "september", tMONTH, 9 }, { "sept", tMONTH, 9 }, { "october", tMONTH, 10 }, { "november", tMONTH, 11 }, { "december", tMONTH, 12 }, | | | 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 | { "july", tMONTH, 7 }, { "august", tMONTH, 8 }, { "september", tMONTH, 9 }, { "sept", tMONTH, 9 }, { "october", tMONTH, 10 }, { "november", tMONTH, 11 }, { "december", tMONTH, 12 }, { "sunday", tDAY, 7 }, { "monday", tDAY, 1 }, { "tuesday", tDAY, 2 }, { "tues", tDAY, 2 }, { "wednesday", tDAY, 3 }, { "wednes", tDAY, 3 }, { "thursday", tDAY, 4 }, { "thur", tDAY, 4 }, |
︙ | ︙ | |||
2334 2335 2336 2337 2338 2339 2340 | int ToSeconds( int Hours, int Minutes, int Seconds, MERIDIAN Meridian) { | < < < < < < < < < < < < | 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 | int ToSeconds( int Hours, int Minutes, int Seconds, MERIDIAN Meridian) { switch (Meridian) { case MER24: return (Hours * 60 + Minutes) * 60 + Seconds; case MERam: return ((Hours % 12) * 60 + Minutes) * 60 + Seconds; case MERpm: return (((Hours % 12) + 12) * 60 + Minutes) * 60 + Seconds; } return -1; /* Should never be reached */ } static int LookupWord( |
︙ | ︙ |
Changes to generic/tclDisassemble.c.
︙ | ︙ | |||
1227 1228 1229 1230 1231 1232 1233 | TclDictPut(NULL, description, "exception", exn); TclDictPut(NULL, description, "instructions", instructions); TclDictPut(NULL, description, "auxiliary", aux); TclDictPut(NULL, description, "commands", commands); TclDictPut(NULL, description, "script", Tcl_NewStringObj(codePtr->source, codePtr->numSrcBytes)); TclDictPut(NULL, description, "namespace", | | | 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 | TclDictPut(NULL, description, "exception", exn); TclDictPut(NULL, description, "instructions", instructions); TclDictPut(NULL, description, "auxiliary", aux); TclDictPut(NULL, description, "commands", commands); TclDictPut(NULL, description, "script", Tcl_NewStringObj(codePtr->source, codePtr->numSrcBytes)); TclDictPut(NULL, description, "namespace", TclNewNamespaceObj((Tcl_Namespace *) codePtr->nsPtr)); TclDictPut(NULL, description, "stackdepth", Tcl_NewWideIntObj(codePtr->maxStackDepth)); TclDictPut(NULL, description, "exceptdepth", Tcl_NewWideIntObj(codePtr->maxExceptDepth)); if (line >= 0) { TclDictPut(NULL, description, "initiallinenumber", Tcl_NewWideIntObj(line)); |
︙ | ︙ |
Changes to generic/tclEncoding.c.
︙ | ︙ | |||
1918 1919 1920 1921 1922 1923 1924 | * passes it to Tcl_Createncoding. * * The file contains binary data but begins with a marker to indicate * byte-ordering so a single binary file can be read on big or * little-endian systems. * * Results: | | | 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 | * passes it to Tcl_Createncoding. * * The file contains binary data but begins with a marker to indicate * byte-ordering so a single binary file can be read on big or * little-endian systems. * * Results: * Returns the new Tcl_Encoding, or NULL if it could * not be created because the file contained invalid data. * * Side effects: * See Tcl_CreateEncoding(). * *------------------------------------------------------------------------- */ |
︙ | ︙ | |||
2420 2421 2422 2423 2424 2425 2426 | static int UtfToUtfProc( void *clientData, /* additional flags */ const char *src, /* Source string in UTF-8. */ int srcLen, /* Source string length in bytes. */ int flags, /* TCL_ENCODING_* conversion control flags. */ | | > > > > | 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 | static int UtfToUtfProc( void *clientData, /* additional flags */ const char *src, /* Source string in UTF-8. */ int srcLen, /* Source string length in bytes. */ int flags, /* TCL_ENCODING_* conversion control flags. */ Tcl_EncodingState *statePtr,/* Place for conversion routine to store state * information used during a piecewise * conversion. Contents of statePtr are * initialized and/or reset by conversion * routine under control of flags argument. */ char *dst, /* Output buffer in which converted string is * stored. */ int dstLen, /* The maximum length of output buffer in * bytes. */ int *srcReadPtr, /* Filled with the number of bytes from the * source string that were converted. This may * be less than the original source length if |
︙ | ︙ | |||
2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 | { const char *srcStart, *srcEnd, *srcClose; const char *dstStart, *dstEnd; int result, numChars, charLimit = INT_MAX; int ch; int profile; result = TCL_OK; srcStart = src; srcEnd = src + srcLen; srcClose = srcEnd; if ((flags & TCL_ENCODING_END) == 0) { srcClose -= 6; } if (flags & TCL_ENCODING_CHAR_LIMIT) { charLimit = *dstCharsPtr; } dstStart = dst; flags |= PTR2INT(clientData); | > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | < < | | | > > | 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 | { const char *srcStart, *srcEnd, *srcClose; const char *dstStart, *dstEnd; int result, numChars, charLimit = INT_MAX; int ch; int profile; if (flags & TCL_ENCODING_START) { /* *statePtr will hold high surrogate in a split surrogate pair */ *statePtr = 0; } result = TCL_OK; srcStart = src; srcEnd = src + srcLen; srcClose = srcEnd; if ((flags & TCL_ENCODING_END) == 0) { srcClose -= 6; } if (flags & TCL_ENCODING_CHAR_LIMIT) { charLimit = *dstCharsPtr; } dstStart = dst; flags |= PTR2INT(clientData); /* * If output is UTF-8 or encoding for Tcl's internal encoding, * max space needed is TCL_UTF_MAX. Otherwise, need 6 bytes (CESU-8) */ dstEnd = dst + dstLen - ((flags & (ENCODING_INPUT|ENCODING_UTF)) ? TCL_UTF_MAX : 6); /* * Macro to output an isolated high surrogate when it is not followed * by a low surrogate. NOT to be called for strict profile since * that should raise an error. */ #define OUTPUT_ISOLATEDSURROGATE \ do { \ Tcl_UniChar high; \ if (PROFILE_REPLACE(profile)) { \ high = UNICODE_REPLACE_CHAR; \ } else { \ high = (Tcl_UniChar)(ptrdiff_t) *statePtr; \ } \ assert(!(flags & ENCODING_UTF)); /* Must be CESU-8 */ \ assert(HIGH_SURROGATE(high)); \ assert(!PROFILE_STRICT(profile)); \ dst += Tcl_UniCharToUtf(high, dst); \ *statePtr = 0; /* Reset state */ \ } while (0) /* * Macro to check for isolated surrogate and either break with * an error if profile is strict, or output an appropriate * character for replace and tcl8 profiles and continue. */ #define CHECK_ISOLATEDSURROGATE \ if (*statePtr) { \ if (PROFILE_STRICT(profile)) { \ result = TCL_CONVERT_SYNTAX; \ break; \ } \ OUTPUT_ISOLATEDSURROGATE; \ continue; /* Rerun loop so length checks etc. repeated */ \ } else \ (void) 0 profile = ENCODING_PROFILE_GET(flags); for (numChars = 0; src < srcEnd && numChars <= charLimit; numChars++) { if ((src > srcClose) && (!Tcl_UtfCharComplete(src, srcEnd - src))) { /* * If there is more string to follow, this will ensure that the * last UTF-8 character in the source buffer hasn't been cut off. */ result = TCL_CONVERT_MULTIBYTE; break; } if (dst > dstEnd) { result = TCL_CONVERT_NOSPACE; break; } if (UCHAR(*src) < 0x80 && !((UCHAR(*src) == 0) && (flags & ENCODING_INPUT))) { CHECK_ISOLATEDSURROGATE; /* * Copy 7bit characters, but skip null-bytes when we are in input * mode, so that they get converted to \xC0\x80. */ *dst++ = *src++; } else if ((UCHAR(*src) == 0xC0) && (src + 1 < srcEnd) && (UCHAR(src[1]) == 0x80) && (!(flags & ENCODING_INPUT) || !PROFILE_TCL8(profile))) { /* Special sequence \xC0\x80 */ CHECK_ISOLATEDSURROGATE; if (!PROFILE_TCL8(profile) && (flags & ENCODING_INPUT)) { if (PROFILE_REPLACE(profile)) { dst += Tcl_UniCharToUtf(UNICODE_REPLACE_CHAR, dst); src += 2; } else { /* PROFILE_STRICT */ result = TCL_CONVERT_SYNTAX; break; } } else { /* * Convert 0xC080 to real nulls when we are in output mode, * irrespective of the profile. */ *dst++ = 0; src += 2; } } else if (!Tcl_UtfCharComplete(src, srcEnd - src)) { /* * Incomplete byte sequence not because there are insufficient * bytes in source buffer (have already checked that above) but * because the UTF-8 sequence is truncated. */ CHECK_ISOLATEDSURROGATE; if (flags & ENCODING_INPUT) { /* Incomplete bytes for modified UTF-8 target */ if (PROFILE_STRICT(profile)) { result = (flags & TCL_ENCODING_CHAR_LIMIT) ? TCL_CONVERT_MULTIBYTE : TCL_CONVERT_SYNTAX; |
︙ | ︙ | |||
2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 | /* TCL_ENCODING_PROFILE_TCL8 */ char chbuf[2]; chbuf[0] = UCHAR(*src++); chbuf[1] = 0; TclUtfToUniChar(chbuf, &ch); } dst += Tcl_UniCharToUtf(ch, dst); } else { size_t len = TclUtfToUniChar(src, &ch); if (flags & ENCODING_INPUT) { if (((len < 2) && (ch != 0)) || ((ch > 0xFFFF) && !(flags & ENCODING_UTF))) { if (PROFILE_STRICT(profile)) { result = TCL_CONVERT_SYNTAX; break; } else if (PROFILE_REPLACE(profile)) { ch = UNICODE_REPLACE_CHAR; } } } const char *saveSrc = src; src += len; if (!(flags & ENCODING_UTF) && !(flags & ENCODING_INPUT) | > > > > > | > > | > > | | | | | | > > | > > > > > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 | /* TCL_ENCODING_PROFILE_TCL8 */ char chbuf[2]; chbuf[0] = UCHAR(*src++); chbuf[1] = 0; TclUtfToUniChar(chbuf, &ch); } dst += Tcl_UniCharToUtf(ch, dst); } else { /* Have a complete character */ size_t len = TclUtfToUniChar(src, &ch); Tcl_UniChar savedSurrogate = (Tcl_UniChar) (ptrdiff_t)*statePtr; *statePtr = 0; /* Reset surrogate */ if (flags & ENCODING_INPUT) { if (((len < 2) && (ch != 0)) || ((ch > 0xFFFF) && !(flags & ENCODING_UTF))) { if (PROFILE_STRICT(profile)) { result = TCL_CONVERT_SYNTAX; break; } else if (PROFILE_REPLACE(profile)) { ch = UNICODE_REPLACE_CHAR; } } } const char *saveSrc = src; src += len; if (!(flags & ENCODING_UTF) && !(flags & ENCODING_INPUT) && (ch > 0x7FF)) { assert(savedSurrogate == 0); /* Since this flag combo will never set *statePtr */ if (ch > 0xFFFF) { /* CESU-8 6-byte sequence for chars > U+FFFF */ ch -= 0x10000; *dst++ = 0xED; *dst++ = (char) (((ch >> 16) & 0x0F) | 0xA0); *dst++ = (char) (((ch >> 10) & 0x3F) | 0x80); ch = (ch & 0x03FF) | 0xDC00; } *dst++ = (char)(((ch >> 12) | 0xE0) & 0xEF); *dst++ = (char)(((ch >> 6) | 0x80) & 0xBF); *dst++ = (char)((ch | 0x80) & 0xBF); continue; } else if (SURROGATE(ch)) { if ((flags & ENCODING_UTF)) { /* UTF-8, not CESU-8, so surrogates should not appear */ if (PROFILE_STRICT(profile)) { result = (flags & ENCODING_INPUT) ? TCL_CONVERT_SYNTAX : TCL_CONVERT_UNKNOWN; src = saveSrc; break; } else if (PROFILE_REPLACE(profile)) { ch = UNICODE_REPLACE_CHAR; } else { /* PROFILE_TCL8 - output as is */ } } else { /* CESU-8 */ if (LOW_SURROGATE(ch)) { if (savedSurrogate) { assert(HIGH_SURROGATE(savedSurrogate)); ch = 0x10000 + ((savedSurrogate - 0xd800) << 10) + (ch - 0xdc00); } else { /* Isolated low surrogate */ if (PROFILE_STRICT(profile)) { result = (flags & ENCODING_INPUT) ? TCL_CONVERT_SYNTAX : TCL_CONVERT_UNKNOWN; src = saveSrc; break; } else if (PROFILE_REPLACE(profile)) { ch = UNICODE_REPLACE_CHAR; } else { /* Tcl8 profile. Output low surrogate as is */ } } } else { assert(HIGH_SURROGATE(ch)); /* Save the high surrogate */ *statePtr = (Tcl_EncodingState) (ptrdiff_t) ch; if (savedSurrogate) { assert(HIGH_SURROGATE(savedSurrogate)); if (PROFILE_STRICT(profile)) { result = (flags & ENCODING_INPUT) ? TCL_CONVERT_SYNTAX : TCL_CONVERT_UNKNOWN; src = saveSrc; break; } else if (PROFILE_REPLACE(profile)) { ch = UNICODE_REPLACE_CHAR; } else { /* Output the isolated high surrogate */ ch = savedSurrogate; } } else { /* High surrogate saved in *statePtr. Do not output anything just yet. */ --numChars; /* Cancel the increment at end of loop */ continue; } } } } else { /* Normal character */ CHECK_ISOLATEDSURROGATE; } dst += Tcl_UniCharToUtf(ch, dst); } } /* Check if an high surrogate left over */ if (*statePtr) { assert(!(flags & ENCODING_UTF)); /* CESU-8, Not UTF-8 */ if (!(flags & TCL_ENCODING_END)) { /* More data coming */ } else { /* No more data coming */ if (PROFILE_STRICT(profile)) { result = (flags & ENCODING_INPUT) ? TCL_CONVERT_SYNTAX : TCL_CONVERT_UNKNOWN; } else { if (PROFILE_REPLACE(profile)) { ch = UNICODE_REPLACE_CHAR; } else { ch = (Tcl_UniChar) (ptrdiff_t) *statePtr; } if (dst < dstEnd) { dst += Tcl_UniCharToUtf(ch, dst); ++numChars; } else { /* No room in destination */ result = TCL_CONVERT_NOSPACE; } } } } *srcReadPtr = src - srcStart; *dstWrotePtr = dst - dstStart; *dstCharsPtr = numChars; return result; } |
︙ | ︙ | |||
2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 | */ if ((srcLen % 2) != 0) { result = TCL_CONVERT_MULTIBYTE; srcLen--; } /* * If last code point is a high surrogate, we cannot handle that yet, * unless we are at the end. */ if (!(flags & TCL_ENCODING_END) && (srcLen >= 2) && ((src[srcLen - ((flags & TCL_ENCODING_LE)?1:2)] & 0xFC) == 0xD8)) { result = TCL_CONVERT_MULTIBYTE; srcLen-= 2; } srcStart = src; srcEnd = src + srcLen; dstStart = dst; dstEnd = dst + dstLen - TCL_UTF_MAX; for (numChars = 0; src < srcEnd && numChars <= charLimit; src += 2, numChars++) { | > > | | > > > > > > > > > > > | | | | < | > | | | | < < | | | > | < < < | | | | | | | > > > | > > | | | | < | > | > > > | | > > > | < | | | < > | | | < | | | > > > > > > > > > > > | > > > > > > > > | > > > > > > > | | | | < | | > | | | > | | > > > > > > > | | > | | | > | < | | | | | | | | | | | | | > > > > | 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 | */ if ((srcLen % 2) != 0) { result = TCL_CONVERT_MULTIBYTE; srcLen--; } #if 0 /* * If last code point is a high surrogate, we cannot handle that yet, * unless we are at the end. */ if (!(flags & TCL_ENCODING_END) && (srcLen >= 2) && ((src[srcLen - ((flags & TCL_ENCODING_LE)?1:2)] & 0xFC) == 0xD8)) { result = TCL_CONVERT_MULTIBYTE; srcLen-= 2; } #endif srcStart = src; srcEnd = src + srcLen; dstStart = dst; dstEnd = dst + dstLen - TCL_UTF_MAX; for (numChars = 0; src < srcEnd && numChars <= charLimit; src += 2, numChars++) { if (dst > dstEnd && !HIGH_SURROGATE(ch)) { result = TCL_CONVERT_NOSPACE; break; } unsigned short prev = ch; if (flags & TCL_ENCODING_LE) { ch = (src[1] & 0xFF) << 8 | (src[0] & 0xFF); } else { ch = (src[0] & 0xFF) << 8 | (src[1] & 0xFF); } if (HIGH_SURROGATE(prev)) { if (LOW_SURROGATE(ch)) { /* * High surrogate was followed by a low surrogate. * Tcl_UniCharToUtf would have stashed away the state in dst. * Call it again to combine that state with the low surrogate. * We also have to compensate the numChars as two UTF-16 units * have been combined into one character. */ dst += Tcl_UniCharToUtf(ch | TCL_COMBINE, dst); } else { /* High surrogate was not followed by a low surrogate */ if (PROFILE_STRICT(flags)) { result = TCL_CONVERT_SYNTAX; src -= 2; /* Go back to beginning of high surrogate */ dst--; /* Also undo writing a single byte too much */ break; } if (PROFILE_REPLACE(flags)) { /* * Previous loop wrote a single byte to mark the high surrogate. * Replace it with the replacement character. */ ch = UNICODE_REPLACE_CHAR; dst--; numChars++; dst += Tcl_UniCharToUtf(ch, dst); } else { /* * Bug [10c2c17c32]. If Hi surrogate not followed by Lo * surrogate, finish 3-byte UTF-8 */ dst += Tcl_UniCharToUtf(-1, dst); } /* Loop around again so destination space and other checks are done */ prev = 0; /* Reset high surrogate tracker */ src -= 2; } } else { /* Previous char was not a high surrogate */ /* * Special case for 1-byte utf chars for speed. Make sure we work with * unsigned short-size data. Order checks based on expected frequency. */ if ((unsigned)ch - 1 < 0x7F) { /* ASCII except nul */ *dst++ = (ch & 0xFF); } else if (!SURROGATE(ch)) { /* Not ASCII, not surrogate */ dst += Tcl_UniCharToUtf(ch, dst); } else if (HIGH_SURROGATE(ch)) { dst += Tcl_UniCharToUtf(ch | TCL_COMBINE, dst); /* Do not count this just yet. Compensate for numChars++ in loop counter */ numChars--; } else { assert(LOW_SURROGATE(ch)); if (PROFILE_STRICT(flags)) { result = TCL_CONVERT_SYNTAX; break; } if (PROFILE_REPLACE(flags)) { ch = UNICODE_REPLACE_CHAR; } dst += Tcl_UniCharToUtf(ch, dst); } } } /* * When the above loop ends, result may have the following values: * 1. TCL_OK - full source buffer was completely processed. * src, dst, numChars will hold values up to that point BUT * there may be a leftover high surrogate we need to deal with. * 2. TCL_CONVERT_NOSPACE - Ran out of room in the destination buffer. * Same considerations as (1) * 3. TCL_CONVERT_SYNTAX - decoding error. * 4. TCL_CONVERT_MULTIBYTE - the buffer passed in was not fully * processed, because there was a trailing single byte. However, * we *may* have processed the requested number of characters already * in which case the trailing byte does not matter. We still * *may* still be a leftover high surrogate as in (1) and (2). */ switch (result) { case TCL_CONVERT_MULTIBYTE: /* FALLTHRU */ case TCL_OK: /* FALLTHRU */ case TCL_CONVERT_NOSPACE: if (HIGH_SURROGATE(ch)) { if (flags & TCL_ENCODING_END) { /* * No more data expected. There will be space for output of * one character (essentially overwriting the dst area holding * high surrogate state) */ assert((dst-1) <= dstEnd); if (PROFILE_STRICT(flags)) { result = TCL_CONVERT_SYNTAX; src -= 2; dst--; } else if (PROFILE_REPLACE(flags)) { dst--; numChars++; dst += Tcl_UniCharToUtf(UNICODE_REPLACE_CHAR, dst); } else { /* Bug [10c2c17c32]. If Hi surrogate, finish 3-byte UTF-8 */ numChars++; dst += Tcl_UniCharToUtf(-1, dst); } } else { /* More data is expected. Revert the surrogate state */ src -= 2; dst--; /* Note: leave result of TCL_CONVERT_NOSPACE as is */ if (result == TCL_OK) { result = TCL_CONVERT_MULTIBYTE; } } } else if ((flags & TCL_ENCODING_END) && (result == TCL_CONVERT_MULTIBYTE)) { /* * If we had a trailing byte at the end AND this is the last * fragment AND profile is not "strict", stick FFFD in its place. * Note in this case we DO need to check for room in dst. */ if (dst > dstEnd) { result = TCL_CONVERT_NOSPACE; } else { if (PROFILE_STRICT(flags)) { result = TCL_CONVERT_SYNTAX; } else { /* PROFILE_REPLACE or PROFILE_TCL8 */ result = TCL_OK; dst += Tcl_UniCharToUtf(UNICODE_REPLACE_CHAR, dst); numChars++; src++; } } } break; case TCL_CONVERT_SYNTAX: break; /* Nothing to do */ } *srcReadPtr = src - srcStart; *dstWrotePtr = dst - dstStart; *dstCharsPtr = numChars; return result; } |
︙ | ︙ | |||
3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 | * last UTF-8 character in the source buffer hasn't been cut off. */ result = TCL_CONVERT_MULTIBYTE; break; } len = TclUtfToUniChar(src, &ch); word = tableFromUnicode[(ch >> 8)][ch & 0xFF]; if ((word == 0) && (ch != 0)) { int oldState; const EscapeSubTable *subTablePtr; oldState = state; | > > > > > > > > > | 4175 4176 4177 4178 4179 4180 4181 4182 4183 4184 4185 4186 4187 4188 4189 4190 4191 4192 4193 4194 4195 4196 4197 | * last UTF-8 character in the source buffer hasn't been cut off. */ result = TCL_CONVERT_MULTIBYTE; break; } len = TclUtfToUniChar(src, &ch); if (ch > 0xFFFF) { /* Bug 201c7a3aa6 crash - tables are 256x256 (64K) */ if (PROFILE_STRICT(flags)) { result = TCL_CONVERT_SYNTAX; break; } /* Will be encoded as encoding specific replacement below */ ch = UNICODE_REPLACE_CHAR; } word = tableFromUnicode[(ch >> 8)][ch & 0xFF]; if ((word == 0) && (ch != 0)) { int oldState; const EscapeSubTable *subTablePtr; oldState = state; |
︙ | ︙ |
Changes to generic/tclEnsemble.c.
︙ | ︙ | |||
13 14 15 16 17 18 19 | #include "tclInt.h" #include "tclCompile.h" /* * Declarations for functions local to this file: */ | < | 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #include "tclInt.h" #include "tclCompile.h" /* * Declarations for functions local to this file: */ static Tcl_Command InitEnsembleFromOptions(Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); static int ReadOneEnsembleOption(Tcl_Interp *interp, Tcl_Command token, Tcl_Obj *optionObj); static int ReadAllEnsembleOptions(Tcl_Interp *interp, Tcl_Command token); static int SetEnsembleConfigOptions(Tcl_Interp *interp, |
︙ | ︙ | |||
121 122 123 124 125 126 127 | * ensemble. */ Command *token; /* Reference to the command for which this * structure is a cache of the resolution. */ Tcl_Obj *fix; /* Corrected spelling, if needed. */ Tcl_HashEntry *hPtr; /* Direct link to entry in the subcommand hash * table. */ } EnsembleCmdRep; | < < < < < < < < < < < < < < < < < < < < < < < < | 120 121 122 123 124 125 126 127 128 129 130 131 132 133 | * ensemble. */ Command *token; /* Reference to the command for which this * structure is a cache of the resolution. */ Tcl_Obj *fix; /* Corrected spelling, if needed. */ Tcl_HashEntry *hPtr; /* Direct link to entry in the subcommand hash * table. */ } EnsembleCmdRep; /* *---------------------------------------------------------------------- * * TclNamespaceEnsembleCmd -- * * Invoked to implement the "namespace ensemble" command that creates and |
︙ | ︙ | |||
365 366 367 368 369 370 371 | Tcl_SetErrorCode(interp, "TCL", "ENSEMBLE", "EMPTY_TARGET", (char *)NULL); goto mapError; } cmd = TclGetString(listv[0]); if (!(cmd[0] == ':' && cmd[1] == ':')) { Tcl_Obj *newList = Tcl_NewListObj(len, listv); | > | | 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 | Tcl_SetErrorCode(interp, "TCL", "ENSEMBLE", "EMPTY_TARGET", (char *)NULL); goto mapError; } cmd = TclGetString(listv[0]); if (!(cmd[0] == ':' && cmd[1] == ':')) { Tcl_Obj *newList = Tcl_NewListObj(len, listv); Tcl_Obj *newCmd = TclNewNamespaceObj( (Tcl_Namespace *) nsPtr); if (nsPtr->parentPtr) { Tcl_AppendStringsToObj(newCmd, "::", (char *)NULL); } Tcl_AppendObjToObj(newCmd, listv[0]); Tcl_ListObjReplace(NULL, newList, 0, 1, 1, &newCmd); if (patchedDict == NULL) { |
︙ | ︙ | |||
488 489 490 491 492 493 494 | if (resultObj != NULL) { Tcl_SetObjResult(interp, resultObj); } break; case CONF_NAMESPACE: { Tcl_Namespace *namespacePtr = NULL; /* silence gcc 4 warning */ Tcl_GetEnsembleNamespace(NULL, token, &namespacePtr); | | | 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 | if (resultObj != NULL) { Tcl_SetObjResult(interp, resultObj); } break; case CONF_NAMESPACE: { Tcl_Namespace *namespacePtr = NULL; /* silence gcc 4 warning */ Tcl_GetEnsembleNamespace(NULL, token, &namespacePtr); Tcl_SetObjResult(interp, TclNewNamespaceObj(namespacePtr)); break; } case CONF_PREFIX: { int flags = 0; /* silence gcc 4 warning */ Tcl_GetEnsembleFlags(NULL, token, &flags); Tcl_SetObjResult(interp, |
︙ | ︙ | |||
548 549 550 551 552 553 554 | (tmpObj != NULL) ? tmpObj : Tcl_NewObj()); /* -namespace option */ Tcl_ListObjAppendElement(NULL, resultObj, Tcl_NewStringObj(ensembleConfigOptions[CONF_NAMESPACE], TCL_AUTO_LENGTH)); Tcl_GetEnsembleNamespace(NULL, token, &namespacePtr); | | | 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 | (tmpObj != NULL) ? tmpObj : Tcl_NewObj()); /* -namespace option */ Tcl_ListObjAppendElement(NULL, resultObj, Tcl_NewStringObj(ensembleConfigOptions[CONF_NAMESPACE], TCL_AUTO_LENGTH)); Tcl_GetEnsembleNamespace(NULL, token, &namespacePtr); Tcl_ListObjAppendElement(NULL, resultObj, TclNewNamespaceObj(namespacePtr)); /* -parameters option */ Tcl_ListObjAppendElement(NULL, resultObj, Tcl_NewStringObj(ensembleConfigOptions[CONF_PARAM], TCL_AUTO_LENGTH)); Tcl_GetEnsembleParameterList(NULL, token, &tmpObj); Tcl_ListObjAppendElement(NULL, resultObj, |
︙ | ︙ | |||
686 687 688 689 690 691 692 | if (TclListObjGetElements(interp, listObj, &len, &listv) != TCL_OK) { goto finishSearchAndError; } cmd = TclGetString(listv[0]); if (!(cmd[0] == ':' && cmd[1] == ':')) { Tcl_Obj *newList = Tcl_DuplicateObj(listObj); | > | | 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 | if (TclListObjGetElements(interp, listObj, &len, &listv) != TCL_OK) { goto finishSearchAndError; } cmd = TclGetString(listv[0]); if (!(cmd[0] == ':' && cmd[1] == ':')) { Tcl_Obj *newList = Tcl_DuplicateObj(listObj); Tcl_Obj *newCmd = TclNewNamespaceObj( (Tcl_Namespace*) nsPtr); if (nsPtr->parentPtr) { Tcl_AppendStringsToObj(newCmd, "::", (char *)NULL); } Tcl_AppendObjToObj(newCmd, listv[0]); Tcl_ListObjReplace(NULL, newList, 0, 1, 1, &newCmd); if (patchedDict == NULL) { |
︙ | ︙ |
Changes to generic/tclEvent.c.
︙ | ︙ | |||
11 12 13 14 15 16 17 18 19 20 21 22 23 24 | * * See the file "license.terms" for information on usage and redistribution of * this file, and for a DISCLAIMER OF ALL WARRANTIES. */ #include "tclInt.h" #include "tclUuid.h" /* * The data structure below is used to report background errors. One such * structure is allocated for each error; it holds information about the * interpreter and the error until an idle handler command can be invoked. */ | > > > | 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | * * See the file "license.terms" for information on usage and redistribution of * this file, and for a DISCLAIMER OF ALL WARRANTIES. */ #include "tclInt.h" #include "tclUuid.h" #if defined(HAVE_ZLIB) && defined(TCL_WITH_INTERNAL_ZLIB) #include "zlib.h" #endif /* HAVE_ZLIB */ /* * The data structure below is used to report background errors. One such * structure is allocated for each error; it holds information about the * interpreter and the error until an idle handler command can be invoked. */ |
︙ | ︙ | |||
1098 1099 1100 1101 1102 1103 1104 | #endif #ifdef STATIC_BUILD ".static" #endif #ifndef TCL_WITH_EXTERNAL_TOMMATH ".tommath-0103" #endif | | | 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 | #endif #ifdef STATIC_BUILD ".static" #endif #ifndef TCL_WITH_EXTERNAL_TOMMATH ".tommath-0103" #endif #if defined(HAVE_ZLIB) && defined(TCL_WITH_INTERNAL_ZLIB) ".zlib-" #if ZLIB_VER_MAJOR < 10 "0" #endif STRINGIFY(ZLIB_VER_MAJOR) #if ZLIB_VER_MINOR < 10 "0" |
︙ | ︙ | |||
1519 1520 1521 1522 1523 1524 1525 | * Legacy "vwait" syntax, skip option handling. */ i = 1; goto endOfOptionLoop; } if ((unsigned) objc - 1 > sizeof(localItems) / sizeof(localItems[0])) { | | | 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 | * Legacy "vwait" syntax, skip option handling. */ i = 1; goto endOfOptionLoop; } if ((unsigned) objc - 1 > sizeof(localItems) / sizeof(localItems[0])) { vwaitItems = (VwaitItem *)Tcl_Alloc(sizeof(VwaitItem) * (objc - 1)); } for (i = 1; i < objc; i++) { const char *name; name = TclGetString(objv[i]); if (name[0] != '-') { |
︙ | ︙ |
Changes to generic/tclExecute.c.
︙ | ︙ | |||
2466 2467 2468 2469 2470 2471 2472 | TEBC_YIELD(); TclNRAddCallback(interp, TclNRCoroutineActivateCallback, corPtr, yieldParameter, NULL, NULL); return TCL_OK; } case INST_TAILCALL: { | | | 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 | TEBC_YIELD(); TclNRAddCallback(interp, TclNRCoroutineActivateCallback, corPtr, yieldParameter, NULL, NULL); return TCL_OK; } case INST_TAILCALL: { Tcl_Obj *listPtr; opnd = TclGetUInt1AtPtr(pc+1); if (!(iPtr->varFramePtr->isProcCallFrame & 1)) { TRACE(("%d => ERROR: tailcall in non-proc context\n", opnd)); Tcl_SetObjResult(interp, Tcl_NewStringObj( "tailcall can only be called from a proc or lambda", -1)); |
︙ | ︙ | |||
2502 2503 2504 2505 2506 2507 2508 | /* * Push the evaluation of the called command into the NR callback * stack. */ listPtr = Tcl_NewListObj(opnd, &OBJ_AT_DEPTH(opnd-1)); | > | < | 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 | /* * Push the evaluation of the called command into the NR callback * stack. */ listPtr = Tcl_NewListObj(opnd, &OBJ_AT_DEPTH(opnd-1)); TclListObjSetElement(NULL, listPtr, 0, TclNewNamespaceObj( (Tcl_Namespace *) iPtr->varFramePtr->nsPtr)); if (iPtr->varFramePtr->tailcallPtr) { Tcl_DecrRefCount(iPtr->varFramePtr->tailcallPtr); } iPtr->varFramePtr->tailcallPtr = listPtr; result = TCL_RETURN; cleanup = opnd; |
︙ | ︙ | |||
4311 4312 4313 4314 4315 4316 4317 | break; /* * ----------------------------------------------------------------- * Start of general introspector instructions. */ | | | < < < < < < < < | 4311 4312 4313 4314 4315 4316 4317 4318 4319 4320 4321 4322 4323 4324 4325 4326 4327 4328 | break; /* * ----------------------------------------------------------------- * Start of general introspector instructions. */ case INST_NS_CURRENT: objResultPtr = TclNewNamespaceObj(TclGetCurrentNamespace(interp)); TRACE_WITH_OBJ(("=> "), objResultPtr); NEXT_INST_F(1, 0, 1); break; case INST_COROUTINE_NAME: { CoroutineData *corPtr = iPtr->execEnvPtr->corPtr; TclNewObj(objResultPtr); if (corPtr && !(corPtr->cmdPtr->flags & CMD_DYING)) { Tcl_GetCommandFullName(interp, (Tcl_Command) corPtr->cmdPtr, |
︙ | ︙ | |||
4679 4680 4681 4682 4683 4684 4685 | case INST_TCLOO_NS: oPtr = (Object *) Tcl_GetObjectFromObj(interp, OBJ_AT_TOS); if (oPtr == NULL) { TRACE(("%.30s => ERROR: not object\n", O2S(OBJ_AT_TOS))); goto gotError; } | < < < < < | | 4671 4672 4673 4674 4675 4676 4677 4678 4679 4680 4681 4682 4683 4684 4685 | case INST_TCLOO_NS: oPtr = (Object *) Tcl_GetObjectFromObj(interp, OBJ_AT_TOS); if (oPtr == NULL) { TRACE(("%.30s => ERROR: not object\n", O2S(OBJ_AT_TOS))); goto gotError; } objResultPtr = TclNewNamespaceObj(oPtr->namespacePtr); TRACE_WITH_OBJ(("%.30s => ", O2S(OBJ_AT_TOS)), objResultPtr); NEXT_INST_F(1, 1, 1); } /* * End of TclOO support instructions. * ----------------------------------------------------------------- |
︙ | ︙ | |||
9130 9131 9132 9133 9134 9135 9136 | Tcl_SetObjResult(interp, Tcl_ObjPrintf( "cannot use a list as %soperand of \"%s\"", ord, op)); Tcl_SetErrorCode(interp, "ARITH", "DOMAIN", "list", (char *)NULL); return; } } Tcl_ObjTypeLengthProc *lengthProc = TclObjTypeHasProc(opndPtr, lengthProc); | | > | 9117 9118 9119 9120 9121 9122 9123 9124 9125 9126 9127 9128 9129 9130 9131 9132 | Tcl_SetObjResult(interp, Tcl_ObjPrintf( "cannot use a list as %soperand of \"%s\"", ord, op)); Tcl_SetErrorCode(interp, "ARITH", "DOMAIN", "list", (char *)NULL); return; } } Tcl_ObjTypeLengthProc *lengthProc = TclObjTypeHasProc(opndPtr, lengthProc); if ((lengthProc && lengthProc(opndPtr) > 1) || TclMaxListLength(TclGetString(opndPtr), TCL_INDEX_NONE, NULL) > 1) { goto listRep; } description = "non-numeric string"; } else if (type == TCL_NUMBER_NAN) { description = "non-numeric floating-point value"; } else if (type == TCL_NUMBER_DOUBLE) { description = "floating-point value"; |
︙ | ︙ |
Changes to generic/tclGetDate.y.
︙ | ︙ | |||
492 493 494 495 496 497 498 | { "july", tMONTH, 7 }, { "august", tMONTH, 8 }, { "september", tMONTH, 9 }, { "sept", tMONTH, 9 }, { "october", tMONTH, 10 }, { "november", tMONTH, 11 }, { "december", tMONTH, 12 }, | | | 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 | { "july", tMONTH, 7 }, { "august", tMONTH, 8 }, { "september", tMONTH, 9 }, { "sept", tMONTH, 9 }, { "october", tMONTH, 10 }, { "november", tMONTH, 11 }, { "december", tMONTH, 12 }, { "sunday", tDAY, 7 }, { "monday", tDAY, 1 }, { "tuesday", tDAY, 2 }, { "tues", tDAY, 2 }, { "wednesday", tDAY, 3 }, { "wednes", tDAY, 3 }, { "thursday", tDAY, 4 }, { "thur", tDAY, 4 }, |
︙ | ︙ | |||
710 711 712 713 714 715 716 | int ToSeconds( int Hours, int Minutes, int Seconds, MERIDIAN Meridian) { | < < < < < < < < < < < < | 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 | int ToSeconds( int Hours, int Minutes, int Seconds, MERIDIAN Meridian) { switch (Meridian) { case MER24: return (Hours * 60 + Minutes) * 60 + Seconds; case MERam: return ((Hours % 12) * 60 + Minutes) * 60 + Seconds; case MERpm: return (((Hours % 12) + 12) * 60 + Minutes) * 60 + Seconds; } return -1; /* Should never be reached */ } static int LookupWord( |
︙ | ︙ |
Changes to generic/tclIO.c.
︙ | ︙ | |||
322 323 324 325 326 327 328 | * a channel name in the context of an interp. Saves the lookup * result and values needed to check its continued validity. */ typedef struct ResolvedChanName { ChannelState *statePtr; /* The saved lookup result */ Tcl_Interp *interp; /* The interp in which the lookup was done. */ | | | 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 | * a channel name in the context of an interp. Saves the lookup * result and values needed to check its continued validity. */ typedef struct ResolvedChanName { ChannelState *statePtr; /* The saved lookup result */ Tcl_Interp *interp; /* The interp in which the lookup was done. */ Tcl_Size epoch; /* The epoch of the channel when the lookup * was done. Use to verify validity. */ size_t refCount; /* Share this struct among many Tcl_Obj. */ } ResolvedChanName; static void DupChannelInternalRep(Tcl_Obj *objPtr, Tcl_Obj *copyPtr); static void FreeChannelInternalRep(Tcl_Obj *objPtr); |
︙ | ︙ | |||
8250 8251 8252 8253 8254 8255 8256 | Tcl_SetChannelBufferSize(chan, newBufferSize); return TCL_OK; } else if (HaveOpt(2, "-encoding")) { Tcl_Encoding encoding; int profile; if ((newValue[0] == '\0') || !strcmp(newValue, "binary")) { | > | > | > > | 8250 8251 8252 8253 8254 8255 8256 8257 8258 8259 8260 8261 8262 8263 8264 8265 8266 8267 8268 8269 | Tcl_SetChannelBufferSize(chan, newBufferSize); return TCL_OK; } else if (HaveOpt(2, "-encoding")) { Tcl_Encoding encoding; int profile; if ((newValue[0] == '\0') || !strcmp(newValue, "binary")) { if (interp) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "unknown encoding \"%s\": No longer supported.\n" "\tplease use either \"-translation binary\" " "or \"-encoding iso8859-1\"", newValue)); } return TCL_ERROR; } else { encoding = Tcl_GetEncoding(interp, newValue); if (encoding == NULL) { return TCL_ERROR; } } |
︙ | ︙ | |||
10555 10556 10557 10558 10559 10560 10561 | } /* *---------------------------------------------------------------------- * * Tcl_GetChannelNamesEx -- * | | | 10559 10560 10561 10562 10563 10564 10565 10566 10567 10568 10569 10570 10571 10572 10573 | } /* *---------------------------------------------------------------------- * * Tcl_GetChannelNamesEx -- * * Return the names of open channels in the interp filtered * through a pattern. If pattern is NULL, it returns all the open * channels. * * Results: * TCL_OK or TCL_ERROR. * * Side effects: |
︙ | ︙ |
Changes to generic/tclIO.h.
︙ | ︙ | |||
216 217 218 219 220 221 222 | */ Tcl_Obj *chanMsg; Tcl_Obj *unreportedMsg; /* Non-NULL if an error report was deferred * because it happened in the background. The * value is the chanMg, if any. #219's * companion to 'unreportedError'. */ | | | 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 | */ Tcl_Obj *chanMsg; Tcl_Obj *unreportedMsg; /* Non-NULL if an error report was deferred * because it happened in the background. The * value is the chanMg, if any. #219's * companion to 'unreportedError'. */ Tcl_Size epoch; /* Used to test validity of stored channelname * lookup results. */ int maxPerms; /* TIP #220: Max access privileges * the channel was created with. */ } ChannelState; /* * Values for the flags field in Channel. Any OR'ed combination of the |
︙ | ︙ |
Changes to generic/tclIORChan.c.
︙ | ︙ | |||
518 519 520 521 522 523 524 | /* * Syntax: chan create MODE CMDPREFIX * [0] [1] [2] [3] * * Actually: rCreate MODE CMDPREFIX * [0] [1] [2] */ | | | | > | 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 | /* * Syntax: chan create MODE CMDPREFIX * [0] [1] [2] [3] * * Actually: rCreate MODE CMDPREFIX * [0] [1] [2] */ enum ArgIndices { MODE = 1, CMD = 2 }; /* * Number of arguments... */ if (objc != 3) { Tcl_WrongNumArgs(interp, 1, objv, "mode cmdprefix"); |
︙ | ︙ | |||
701 702 703 704 705 706 707 | clonePtr->truncateProc = NULL; } chanPtr->typePtr = clonePtr; } /* | | | 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 | clonePtr->truncateProc = NULL; } chanPtr->typePtr = clonePtr; } /* * Register the channel in the I/O system, and in our map for 'chan * postevent'. */ Tcl_RegisterChannel(interp, chan); rcmPtr = GetReflectedChannelMap(interp); hPtr = Tcl_CreateHashEntry(&rcmPtr->map, chanPtr->state->channelName, |
︙ | ︙ | |||
735 736 737 738 739 740 741 | error: Tcl_DecrRefCount(rcPtr->name); Tcl_DecrRefCount(rcPtr->methods); Tcl_DecrRefCount(rcPtr->cmd); Tcl_Free(rcPtr); return TCL_ERROR; | < < < | 736 737 738 739 740 741 742 743 744 745 746 747 748 749 | error: Tcl_DecrRefCount(rcPtr->name); Tcl_DecrRefCount(rcPtr->methods); Tcl_DecrRefCount(rcPtr->cmd); Tcl_Free(rcPtr); return TCL_ERROR; } /* *---------------------------------------------------------------------- * * TclChanPostEventObjCmd -- * |
︙ | ︙ | |||
822 823 824 825 826 827 828 | * [0] [1] [2] [3] * * Actually: rPostevent CHANNEL EVENTSPEC * [0] [1] [2] * * where EVENTSPEC = {read write ...} (Abbreviations allowed as well). */ | | | | > | 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 | * [0] [1] [2] [3] * * Actually: rPostevent CHANNEL EVENTSPEC * [0] [1] [2] * * where EVENTSPEC = {read write ...} (Abbreviations allowed as well). */ enum ArgIndices { CHAN = 1, EVENT = 2 }; const char *chanId; /* Tcl level channel handle */ Tcl_Channel chan; /* Channel associated to the handle */ const Tcl_ChannelType *chanTypePtr; /* Its associated driver structure */ ReflectedChannel *rcPtr; /* Associated instance data */ int events; /* Mask of events to post */ |
︙ | ︙ | |||
976 977 978 979 980 981 982 | /* * Squash interp results left by the event script. */ Tcl_ResetResult(interp); return TCL_OK; | < < < | 975 976 977 978 979 980 981 982 983 984 985 986 987 988 | /* * Squash interp results left by the event script. */ Tcl_ResetResult(interp); return TCL_OK; } /* * Channel error message marshalling utilities. */ static Tcl_Obj * |
︙ | ︙ | |||
2983 2984 2985 2986 2987 2988 2989 | * Notes regarding access to the referenced data. * * In principle the data belongs to the originating thread (see * evPtr->src), however this thread is currently blocked at (*), i.e., * quiescent. Because of this we can treat the data as belonging to us, * without fear of race conditions. I.e. we can read and write as we like. * | | | 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 | * Notes regarding access to the referenced data. * * In principle the data belongs to the originating thread (see * evPtr->src), however this thread is currently blocked at (*), i.e., * quiescent. Because of this we can treat the data as belonging to us, * without fear of race conditions. I.e. we can read and write as we like. * * The only thing we cannot be sure of is the resultPtr. This can be * NULLed if the originating thread went away while the event is handled * here now. */ ForwardingEvent *evPtr = (ForwardingEvent *) evGPtr; ForwardingResult *resultPtr = evPtr->resultPtr; ReflectedChannel *rcPtr = evPtr->rcPtr; |
︙ | ︙ |
Changes to generic/tclIORTrans.c.
︙ | ︙ | |||
525 526 527 528 529 530 531 | /* * Syntax: chan push CHANNEL CMDPREFIX * [0] [1] [2] [3] * * Actually: rPush CHANNEL CMDPREFIX * [0] [1] [2] */ | | | | > | 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 | /* * Syntax: chan push CHANNEL CMDPREFIX * [0] [1] [2] [3] * * Actually: rPush CHANNEL CMDPREFIX * [0] [1] [2] */ enum ArgIndices { CHAN = 1, CMD = 2 }; /* * Number of arguments... */ if (objc != 3) { Tcl_WrongNumArgs(interp, 1, objv, "channel cmdprefix"); |
︙ | ︙ | |||
678 679 680 681 682 683 684 | rtPtr->methods = methods; rtPtr->mode = mode; rtPtr->chan = Tcl_StackChannel(interp, &reflectedTransformType, rtPtr, mode, rtPtr->parent); /* | | | 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 | rtPtr->methods = methods; rtPtr->mode = mode; rtPtr->chan = Tcl_StackChannel(interp, &reflectedTransformType, rtPtr, mode, rtPtr->parent); /* * Register the transform in our map for proper handling of deleted * interpreters and/or threads. */ rtmPtr = GetReflectedTransformMap(interp); hPtr = Tcl_CreateHashEntry(&rtmPtr->map, TclGetString(rtId), &isNew); if (!isNew && rtPtr != Tcl_GetHashValue(hPtr)) { Tcl_Panic("TclChanPushObjCmd: duplicate transformation handle"); |
︙ | ︙ | |||
710 711 712 713 714 715 716 | /* * We are not going through ReflectClose as we never had a channel * structure. */ Tcl_EventuallyFree(rtPtr, FreeReflectedTransform); return TCL_ERROR; | < < < | 711 712 713 714 715 716 717 718 719 720 721 722 723 724 | /* * We are not going through ReflectClose as we never had a channel * structure. */ Tcl_EventuallyFree(rtPtr, FreeReflectedTransform); return TCL_ERROR; } /* *---------------------------------------------------------------------- * * TclChanPopObjCmd -- * |
︙ | ︙ | |||
747 748 749 750 751 752 753 | /* * Syntax: chan pop CHANNEL * [0] [1] [2] * * Actually: rPop CHANNEL * [0] [1] */ | | | > | 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 | /* * Syntax: chan pop CHANNEL * [0] [1] [2] * * Actually: rPop CHANNEL * [0] [1] */ enum ArgIndices { CHAN = 1 }; const char *chanId; /* Tcl level channel handle */ Tcl_Channel chan; /* Channel associated to the handle */ int mode; /* Channel r/w mode */ /* * Number of arguments... |
︙ | ︙ | |||
782 783 784 785 786 787 788 | /* * Removing transformations is generic, and not restricted to reflected * transformations. */ Tcl_UnstackChannel(interp, chan); return TCL_OK; | < < | 781 782 783 784 785 786 787 788 789 790 791 792 793 794 | /* * Removing transformations is generic, and not restricted to reflected * transformations. */ Tcl_UnstackChannel(interp, chan); return TCL_OK; } /* * Channel error message marshalling utilities. */ static Tcl_Obj * |
︙ | ︙ | |||
2469 2470 2471 2472 2473 2474 2475 | * Notes regarding access to the referenced data. * * In principle the data belongs to the originating thread (see * evPtr->src), however this thread is currently blocked at (*), i.e. * quiescent. Because of this we can treat the data as belonging to us, * without fear of race conditions. I.e. we can read and write as we like. * | | | 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 | * Notes regarding access to the referenced data. * * In principle the data belongs to the originating thread (see * evPtr->src), however this thread is currently blocked at (*), i.e. * quiescent. Because of this we can treat the data as belonging to us, * without fear of race conditions. I.e. we can read and write as we like. * * The only thing we cannot be sure of is the resultPtr. This can be * NULLed if the originating thread went away while the event is handled * here now. */ ForwardingEvent *evPtr = (ForwardingEvent *) evGPtr; ForwardingResult *resultPtr = evPtr->resultPtr; ReflectedTransform *rtPtr = evPtr->rtPtr; |
︙ | ︙ |
Changes to generic/tclIOUtil.c.
︙ | ︙ | |||
445 446 447 448 449 450 451 452 453 454 455 456 457 458 | tsdPtr->initialized = 0; } int TclFSCwdIsNative(void) { ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&fsDataKey); if (tsdPtr->cwdClientData != NULL) { return 1; } else { return 0; } } | > > > > > | 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 | tsdPtr->initialized = 0; } int TclFSCwdIsNative(void) { ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&fsDataKey); /* if not yet initialized - ensure we'll once obtain cwd */ if (!tsdPtr->cwdPathEpoch) { Tcl_FSGetCwd(NULL); } if (tsdPtr->cwdClientData != NULL) { return 1; } else { return 0; } } |
︙ | ︙ | |||
1214 1215 1216 1217 1218 1219 1220 | * normalized pathname changes. * * Tcl has no control over (2) and (3), so each registered filesystem must * call Tcl_FSMountsChnaged in each of those circumstances. * * The reason for the exception in 2,3 for the native filesystem is that * the native filesystem claims every file without determining whether | | | 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 | * normalized pathname changes. * * Tcl has no control over (2) and (3), so each registered filesystem must * call Tcl_FSMountsChnaged in each of those circumstances. * * The reason for the exception in 2,3 for the native filesystem is that * the native filesystem claims every file without determining whether * the file exists, or even whether the pathname makes sense. * *---------------------------------------------------------------------- */ void Tcl_FSMountsChanged( TCL_UNUSED(const Tcl_Filesystem *) /*fsPtr*/) |
︙ | ︙ | |||
2009 2010 2011 2012 2013 2014 2015 | * this is implemented in the C library as a thread-local value , but this * is *really* unsafe to assume! * * Results: * None. * * Side effects: | | | 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 | * this is implemented in the C library as a thread-local value , but this * is *really* unsafe to assume! * * Results: * None. * * Side effects: * Modifies the Tcl error code value. * *---------------------------------------------------------------------- */ void Tcl_SetErrno( int err) /* The new value. */ |
︙ | ︙ | |||
2191 2192 2193 2194 2195 2196 2197 | const char *modeString, /* A list of POSIX open modes or a string such * as "rw". */ int permissions) /* What modes to use if opening the file * involves creating it. */ { const Tcl_Filesystem *fsPtr; Tcl_Channel retVal = NULL; | < < < < < < < < | 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 | const char *modeString, /* A list of POSIX open modes or a string such * as "rw". */ int permissions) /* What modes to use if opening the file * involves creating it. */ { const Tcl_Filesystem *fsPtr; Tcl_Channel retVal = NULL; fsPtr = Tcl_FSGetFileSystemForPath(pathPtr); if (fsPtr != NULL && fsPtr->openFileChannelProc != NULL) { int mode, modeFlags; /* * Parse the mode to determine whether to seek at the outset * and/or set the channel into binary mode. |
︙ | ︙ | |||
2768 2769 2770 2771 2772 2773 2774 | retVal = fsPtr->internalToNormalizedProc(retCd); Tcl_IncrRefCount(retVal); } if (retVal == NULL) { /* | | | 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 | retVal = fsPtr->internalToNormalizedProc(retCd); Tcl_IncrRefCount(retVal); } if (retVal == NULL) { /* * The current directory could not be determined. Reset the * current direcory to ensure, for example, that 'pwd' does actually * throw the correct error in Tcl. This is tested for in the test * suite on unix. */ FsUpdateCwd(NULL, NULL); goto cdDidNotChange; |
︙ | ︙ | |||
2943 2944 2945 2946 2947 2948 2949 | TclFSGetCwdProc2 *proc2 = (TclFSGetCwdProc2 *) fsPtr->getCwdProc; cd = proc2(oldcd); if (cd != oldcd) { /* * Call getCwdProc() and store the resulting internal handle to | | | 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 | TclFSGetCwdProc2 *proc2 = (TclFSGetCwdProc2 *) fsPtr->getCwdProc; cd = proc2(oldcd); if (cd != oldcd) { /* * Call getCwdProc() and store the resulting internal handle to * compare things with it later. This might not be * exactly the same string as that of the fully normalized * pathname. For example, for the Windows internal handle the * separator is the backslash character. On Unix it might well * be true that the internal handle is the fully normalized * pathname and one could simply use: * cd = Tcl_FSGetNativePath(pathPtr); * but this can't be guaranteed in the general case. In fact, |
︙ | ︙ | |||
3511 3512 3513 3514 3515 3516 3517 | /* * Determine which filesystem contains the temporary copy of the file. */ if (tvdlPtr->divertedFilesystem == NULL) { /* | | | 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 | /* * Determine which filesystem contains the temporary copy of the file. */ if (tvdlPtr->divertedFilesystem == NULL) { /* * Use the function for the native filsystem, which works even at * this late stage. */ TclpDeleteFile(tvdlPtr->divertedFileNativeRep); NativeFreeInternalRep(tvdlPtr->divertedFileNativeRep); } else { /* |
︙ | ︙ | |||
3574 3575 3576 3577 3578 3579 3580 | *---------------------------------------------------------------------- */ void * Tcl_FindSymbol( Tcl_Interp *interp, /* The relevant interpreter. */ Tcl_LoadHandle loadHandle, /* A handle for the loaded object. */ | | | 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 | *---------------------------------------------------------------------- */ void * Tcl_FindSymbol( Tcl_Interp *interp, /* The relevant interpreter. */ Tcl_LoadHandle loadHandle, /* A handle for the loaded object. */ const char *symbol) /* The name of the symbol to resolve. */ { return loadHandle->findSymbolProcPtr(interp, loadHandle, symbol); } /* *---------------------------------------------------------------------- * |
︙ | ︙ | |||
3953 3954 3955 3956 3957 3958 3959 | /* If not NULL, a place to store a pointer to * the filesystem for this pathname when it is * an absolute pathname. */ Tcl_Size *driveNameLengthPtr, /* If not NULL, a place to store the length of * the volume name if the pathname is absolute. */ Tcl_Obj **driveNameRef) /* If not NULL, a place to store a pointer to | | | | 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 | /* If not NULL, a place to store a pointer to * the filesystem for this pathname when it is * an absolute pathname. */ Tcl_Size *driveNameLengthPtr, /* If not NULL, a place to store the length of * the volume name if the pathname is absolute. */ Tcl_Obj **driveNameRef) /* If not NULL, a place to store a pointer to * an object having its refCount already * incremented, and contining the name of the * volume if the pathname is absolute. */ { FilesystemRecord *fsRecPtr; Tcl_PathType type = TCL_PATH_RELATIVE; /* * Determine whether the given pathname is an absolute pathname on some * filesystem other than the native filesystem. */ fsRecPtr = FsGetFirstFilesystem(); Claim(); while (fsRecPtr != NULL) { /* * Skip the native filesystem because otherwise some of the tests * in the Tcl testsuite might fail because some of the tests * artificially change the current platform (between win, unix) but the * list of volumes obtained by calling fsRecPtr->fsPtr->listVolumesProc * reflects the current (real) platform only. In particular, on Unix * '/' matchs the beginning of certain absolute Windows pathnames * starting '//' and those tests go wrong. * |
︙ | ︙ | |||
4032 4033 4034 4035 4036 4037 4038 | } break; } } Tcl_DecrRefCount(thisFsVolumes); if (type == TCL_PATH_ABSOLUTE) { /* | | | 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 | } break; } } Tcl_DecrRefCount(thisFsVolumes); if (type == TCL_PATH_ABSOLUTE) { /* * No need to examine additional filesystems. */ break; } } } fsRecPtr = fsRecPtr->nextPtr; |
︙ | ︙ | |||
4283 4284 4285 4286 4287 4288 4289 | } /* *--------------------------------------------------------------------------- * * Tcl_FSCopyDirectory -- * | | | 4280 4281 4282 4283 4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 | } /* *--------------------------------------------------------------------------- * * Tcl_FSCopyDirectory -- * * If both pathnames correspond to the same filesystem, calls * 'copyDirectoryProc' of that filesystem. * * Results: * A standard Tcl return code, or -1 if no 'copyDirectoryProc' is found. * * Side effects: * A directory may be copied. POSIX error 'EXDEV' is set if no |
︙ | ︙ | |||
4347 4348 4349 4350 4351 4352 4353 | int Tcl_FSRemoveDirectory( Tcl_Obj *pathPtr, /* The pathname of the directory to be removed. */ int recursive, /* If zero, removes only an empty directory. * Otherwise, removes the directory and all its * contents. */ Tcl_Obj **errorPtr) /* If not NULL and an error occurs, stores a | | | 4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 4354 4355 4356 4357 4358 | int Tcl_FSRemoveDirectory( Tcl_Obj *pathPtr, /* The pathname of the directory to be removed. */ int recursive, /* If zero, removes only an empty directory. * Otherwise, removes the directory and all its * contents. */ Tcl_Obj **errorPtr) /* If not NULL and an error occurs, stores a * place to store a pointer to a new * object having a refCount of 1 and containing * the name of the file that produced an error. */ { const Tcl_Filesystem *fsPtr = Tcl_FSGetFileSystemForPath(pathPtr); if (fsPtr == NULL) { Tcl_SetErrno(ENOENT); |
︙ | ︙ |
Changes to generic/tclIcu.c.
︙ | ︙ | |||
14 15 16 17 18 19 20 | #include "tclInt.h" /* * Runtime linking of libicu. */ typedef enum UBreakIteratorTypex { | | | | > | > | | | | | | | | > | | > | > | > | > | > > | | 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | #include "tclInt.h" /* * Runtime linking of libicu. */ typedef enum UBreakIteratorTypex { UBRK_CHARACTERX = 0, UBRK_WORDX = 1 } UBreakIteratorTypex; typedef enum UErrorCodex { U_AMBIGUOUS_ALIAS_WARNING = -122, U_ZERO_ERRORZ = 0, /**< No error, no warning. */ } UErrorCodex; #define U_SUCCESS(x) ((x)<=U_ZERO_ERRORZ) #define U_FAILURE(x) ((x)>U_ZERO_ERRORZ) struct UEnumeration; typedef struct UEnumeration UEnumeration; struct UCharsetDetector; typedef struct UCharsetDetector UCharsetDetector; struct UCharsetMatch; typedef struct UCharsetMatch UCharsetMatch; typedef struct UBreakIterator UBreakIterator; /* * Prototypes for ICU functions sorted by category. */ typedef void (*fn_u_cleanup)(void); typedef const char *(*fn_u_errorName)(UErrorCodex); typedef uint16_t (*fn_ucnv_countAliases)(const char *, UErrorCodex *); typedef int32_t (*fn_ucnv_countAvailable)(void); typedef const char *(*fn_ucnv_getAlias)(const char *, uint16_t, UErrorCodex *); typedef const char *(*fn_ucnv_getAvailableName)(int32_t); typedef UBreakIterator *(*fn_ubrk_open)( UBreakIteratorTypex, const char *, const uint16_t *, int32_t, UErrorCodex *); typedef void (*fn_ubrk_close)(UBreakIterator *); typedef int32_t (*fn_ubrk_preceding)(UBreakIterator *, int32_t); typedef int32_t (*fn_ubrk_following)(UBreakIterator *, int32_t); typedef int32_t (*fn_ubrk_previous)(UBreakIterator *); typedef int32_t (*fn_ubrk_next)(UBreakIterator *); typedef void (*fn_ubrk_setText)( UBreakIterator *, const void *, int32_t, UErrorCodex *); typedef UCharsetDetector * (*fn_ucsdet_open)(UErrorCodex *status); typedef void (*fn_ucsdet_close)(UCharsetDetector *ucsd); typedef void (*fn_ucsdet_setText)(UCharsetDetector *ucsd, const char *textIn, int32_t len, UErrorCodex *status); typedef const char * (*fn_ucsdet_getName)( const UCharsetMatch *ucsm, UErrorCodex *status); typedef UEnumeration * (*fn_ucsdet_getAllDetectableCharsets)( UCharsetDetector *ucsd, UErrorCodex *status); typedef const UCharsetMatch * (*fn_ucsdet_detect)( UCharsetDetector *ucsd, UErrorCodex *status); typedef const UCharsetMatch ** (*fn_ucsdet_detectAll)( UCharsetDetector *ucsd, int32_t *matchesFound, UErrorCodex *status); typedef void (*fn_uenum_close)(UEnumeration *); typedef int32_t (*fn_uenum_count)(UEnumeration *, UErrorCodex *); typedef const char *(*fn_uenum_next)(UEnumeration *, int32_t *, UErrorCodex *); #define FIELD(name) fn_ ## name _ ## name static struct { size_t nopen; /* Total number of references to ALL libraries */ /* * Depending on platform, ICU symbols may be distributed amongst * multiple libraries. For current functionality at most 2 needed. * Order of library loading is not guaranteed. */ Tcl_LoadHandle libs[2]; |
︙ | ︙ | |||
102 103 104 105 106 107 108 | FIELD(ucsdet_getName); FIELD(ucsdet_open); FIELD(ucsdet_setText); FIELD(uenum_close); FIELD(uenum_count); FIELD(uenum_next); | < | 111 112 113 114 115 116 117 118 119 120 121 122 123 124 | FIELD(ucsdet_getName); FIELD(ucsdet_open); FIELD(ucsdet_setText); FIELD(uenum_close); FIELD(uenum_count); FIELD(uenum_next); } icu_fns = { 0, {NULL, NULL}, /* Reference count, library handles */ NULL, NULL, /* u_* */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* ubrk* */ NULL, NULL, NULL, NULL, /* ucnv_* */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* ucsdet* */ NULL, NULL, NULL, /* uenum_* */ |
︙ | ︙ | |||
142 143 144 145 146 147 148 | #define uenum_next icu_fns._uenum_next #define uenum_close icu_fns._uenum_close #define uenum_count icu_fns._uenum_count TCL_DECLARE_MUTEX(icu_mutex); | | > > > | > > | | > > > > | > | | < < | > | > > > > > | > > > | > | > | > | | < | | < | > | > | > > | > | > > | > < | | | | | > > | | | | | | | | | 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 | #define uenum_next icu_fns._uenum_next #define uenum_close icu_fns._uenum_close #define uenum_count icu_fns._uenum_count TCL_DECLARE_MUTEX(icu_mutex); /* Error handlers. */ static int FunctionNotAvailableError( Tcl_Interp *interp) { if (interp) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "ICU function not available", TCL_AUTO_LENGTH)); Tcl_SetErrorCode(interp, "TCL", "ICU", "UNSUPPORTED_OP", NULL); } return TCL_ERROR; } static int IcuError( Tcl_Interp *interp, const char *message, UErrorCodex code) { if (interp) { const char *codeMessage = NULL; if (u_errorName) { codeMessage = u_errorName(code); } Tcl_SetObjResult(interp, Tcl_ObjPrintf( "%s. ICU error (%d): %s", message, code, codeMessage ? codeMessage : "")); Tcl_SetErrorCode(interp, "TCL", "ICU", codeMessage, NULL); } return TCL_ERROR; } /* * Detect the likely encoding of the string encoded in the given byte array. */ static int DetectEncoding( Tcl_Interp *interp, Tcl_Obj *objPtr, int all) { Tcl_Size len; const char *bytes; const UCharsetMatch *match; const UCharsetMatch **matches; int nmatches; int ret; // Confirm we have the profile of functions we need. if (ucsdet_open == NULL || ucsdet_setText == NULL || ucsdet_detect == NULL || ucsdet_detectAll == NULL || ucsdet_getName == NULL || ucsdet_close == NULL) { return FunctionNotAvailableError(interp); } bytes = (char *) Tcl_GetBytesFromObj(interp, objPtr, &len); if (bytes == NULL) { return TCL_ERROR; } UErrorCodex status = U_ZERO_ERRORZ; UCharsetDetector* csd = ucsdet_open(&status); if (U_FAILURE(status)) { return IcuError(interp, "Could not open charset detector", status); } ucsdet_setText(csd, bytes, len, &status); if (U_FAILURE(status)) { IcuError(interp, "Could not set detection text", status); ucsdet_close(csd); return TCL_ERROR; } if (all) { matches = ucsdet_detectAll(csd, &nmatches, &status); } else { match = ucsdet_detect(csd, &status); matches = &match; nmatches = match ? 1 : 0; } if (U_FAILURE(status) || nmatches == 0) { ret = IcuError(interp, "Could not detect character set", status); } else { int i; Tcl_Obj *resultObj = Tcl_NewListObj(nmatches, NULL); for (i = 0; i < nmatches; ++i) { const char *name = ucsdet_getName(matches[i], &status); if (U_FAILURE(status) || name == NULL) { name = "unknown"; status = U_ZERO_ERRORZ; /* Reset on failure */ } Tcl_ListObjAppendElement( NULL, resultObj, Tcl_NewStringObj(name, TCL_AUTO_LENGTH)); } Tcl_SetObjResult(interp, resultObj); ret = TCL_OK; } ucsdet_close(csd); return ret; } static int DetectableEncodings( Tcl_Interp *interp) { // Confirm we have the profile of functions we need. if (ucsdet_open == NULL || ucsdet_getAllDetectableCharsets == NULL || ucsdet_close == NULL || uenum_next == NULL || uenum_count == NULL || uenum_close == NULL) { return FunctionNotAvailableError(interp); } UErrorCodex status = U_ZERO_ERRORZ; UCharsetDetector *csd = ucsdet_open(&status); if (U_FAILURE(status)) { return IcuError(interp, "Could not open charset detector", status); } int ret; UEnumeration *enumerator = ucsdet_getAllDetectableCharsets(csd, &status); if (U_FAILURE(status) || enumerator == NULL) { IcuError(interp, "Could not get list of detectable encodings", status); ret = TCL_ERROR; } else { int32_t count = uenum_count(enumerator, &status); if (U_FAILURE(status)) { IcuError(interp, "Could not get charset enumerator count", status); ret = TCL_ERROR; } else { int i; Tcl_Obj *resultObj = Tcl_NewListObj(0, NULL); for (i = 0; i < count; ++i) { const char *name; int32_t len; name = uenum_next(enumerator, &len, &status); if (name == NULL || U_FAILURE(status)) { name = "unknown"; len = 7; status = U_ZERO_ERRORZ; /* Reset on error */ } Tcl_ListObjAppendElement( NULL, resultObj, Tcl_NewStringObj(name, len)); } Tcl_SetObjResult(interp, resultObj); ret = TCL_OK; } uenum_close(enumerator); } ucsdet_close(csd); return ret; } /* *------------------------------------------------------------------------ * * EncodingDetectObjCmd -- * * Implements the Tcl command EncodingDetect. * encdetect - returns names of all detectable encodings * encdetect BYTES ?-all? - return detected encoding(s) * * Results: * TCL_OK - Success. * TCL_ERROR - Error. * * Side effects: * Interpreter result holds result or error message. * *------------------------------------------------------------------------ */ static int IcuDetectObjCmd( TCL_UNUSED(void *), Tcl_Interp *interp, |
︙ | ︙ | |||
319 320 321 322 323 324 325 | if (objc == 1) { return DetectableEncodings(interp); } int all = 0; if (objc == 3) { if (strcmp("-all", Tcl_GetString(objv[2]))) { | | < | | | | | | | | | | | > | | | | | | | | | | | | > > > | | | > > > > > > > > > > > | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > < | 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 | if (objc == 1) { return DetectableEncodings(interp); } int all = 0; if (objc == 3) { if (strcmp("-all", Tcl_GetString(objv[2]))) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "Invalid option %s, must be \"-all\"", Tcl_GetString(objv[2]))); return TCL_ERROR; } all = 1; } return DetectEncoding(interp, objv[1], all); } /* *------------------------------------------------------------------------ * * IcuConverterNamesObjCmd -- * * Sets interp result to list of available ICU converters. * * Results: * TCL_OK - Success. * TCL_ERROR - Error. * * Side effects: * Interpreter result holds list of converter names. * *------------------------------------------------------------------------ */ static int IcuConverterNamesObjCmd( TCL_UNUSED(void *), Tcl_Interp *interp, /* Current interpreter. */ int objc, /* Number of arguments. */ Tcl_Obj *const objv[]) /* Argument objects. */ { if (objc != 1) { Tcl_WrongNumArgs(interp, 1 , objv, ""); return TCL_ERROR; } if (ucnv_countAvailable == NULL || ucnv_getAvailableName == NULL) { return FunctionNotAvailableError(interp); } int32_t count = ucnv_countAvailable(); if (count <= 0) { return TCL_OK; } Tcl_Obj *resultObj = Tcl_NewListObj(count, NULL); int32_t i; for (i = 0; i < count; ++i) { const char *name = ucnv_getAvailableName(i); if (name) { Tcl_ListObjAppendElement(NULL, resultObj, Tcl_NewStringObj(name, TCL_AUTO_LENGTH)); } } Tcl_SetObjResult(interp, resultObj); return TCL_OK; } /* *------------------------------------------------------------------------ * * IcuConverterAliasesObjCmd -- * * Sets interp result to list of available ICU converters. * * Results: * TCL_OK - Success. * TCL_ERROR - Error. * * Side effects: * Interpreter result holds list of converter names. * *------------------------------------------------------------------------ */ static int IcuConverterAliasesObjCmd( TCL_UNUSED(void *), Tcl_Interp *interp, /* Current interpreter. */ int objc, /* Number of arguments. */ Tcl_Obj *const objv[]) /* Argument objects. */ { if (objc != 2) { Tcl_WrongNumArgs(interp, 1 , objv, "convertername"); return TCL_ERROR; } if (ucnv_countAliases == NULL || ucnv_getAlias == NULL) { return FunctionNotAvailableError(interp); } const char *name = Tcl_GetString(objv[1]); UErrorCodex status = U_ZERO_ERRORZ; uint16_t count = ucnv_countAliases(name, &status); if (status != U_AMBIGUOUS_ALIAS_WARNING && U_FAILURE(status)) { return IcuError(interp, "Could not get aliases", status); } if (count <= 0) { return TCL_OK; } Tcl_Obj *resultObj = Tcl_NewListObj(count, NULL); uint16_t i; for (i = 0; i < count; ++i) { status = U_ZERO_ERRORZ; /* Reset in case U_AMBIGUOUS_ALIAS_WARNING */ const char *aliasName = ucnv_getAlias(name, i, &status); if (status != U_AMBIGUOUS_ALIAS_WARNING && U_FAILURE(status)) { status = U_ZERO_ERRORZ; /* Reset error for next iteration */ continue; } if (aliasName) { Tcl_ListObjAppendElement(NULL, resultObj, Tcl_NewStringObj(aliasName, TCL_AUTO_LENGTH)); } } Tcl_SetObjResult(interp, resultObj); return TCL_OK; } /* *------------------------------------------------------------------------ * * TclIcuCleanup -- * * Called whenever a command referencing the ICU function table is * deleted. When the reference count drops to zero, the table is released * and the ICU shared libraries are unloaded. * *------------------------------------------------------------------------ */ static void TclIcuCleanup( TCL_UNUSED(void *)) { Tcl_MutexLock(&icu_mutex); if (icu_fns.nopen-- <= 1) { int i; if (u_cleanup != NULL) { u_cleanup(); } for (i = 0; i < (int)(sizeof(icu_fns.libs) / sizeof(icu_fns.libs[0])); ++i) { if (icu_fns.libs[i] != NULL) { Tcl_FSUnloadFile(NULL, icu_fns.libs[i]); } } memset(&icu_fns, 0, sizeof(icu_fns)); } Tcl_MutexUnlock(&icu_mutex); } /* *------------------------------------------------------------------------ * * IcuFindSymbol -- * * Finds an ICU symbol in a shared library and returns its value. * * Caller must be holding icu_mutex lock. * * Results: * Returns the symbol value or NULL if not found. * *------------------------------------------------------------------------ */ static void * IcuFindSymbol( Tcl_LoadHandle loadH, /* Handle to shared library containing symbol */ const char *name, /* Name of function */ const char *suffix /* Suffix that may be present */ ) { /* * ICU symbols may have a version suffix depending on how it was built. * Rather than try both forms every time, suffixConvention remembers if a * suffix is needed (all functions will have it, or none will) * 0 - don't know, 1 - have suffix, -1 - no suffix */ static int suffixConvention = 0; char symbol[256]; void *value = NULL; /* Note we only update suffixConvention on a positive result */ strcpy(symbol, name); if (suffixConvention <= 0) { /* Either don't need suffix or don't know if we do */ value = Tcl_FindSymbol(NULL, loadH, symbol); if (value) { suffixConvention = -1; /* Remember that no suffixes present */ return value; } } if (suffixConvention >= 0) { /* Either need suffix or don't know if we do */ strcat(symbol, suffix); value = Tcl_FindSymbol(NULL, loadH, symbol); if (value) { suffixConvention = 1; } } return value; } /* *------------------------------------------------------------------------ * * TclIcuInit -- * * Load the ICU commands into the given interpreter. If the ICU * commands have never previously been loaded, the ICU libraries are * loaded first. * *------------------------------------------------------------------------ */ static void TclIcuInit( Tcl_Interp *interp) { Tcl_MutexLock(&icu_mutex); char icuversion[4] = "_80"; /* Highest ICU version + 1 */ /* * The initialization below clones the existing one from Tk. May need * revisiting. * ICU shared library names as well as function names *may* be versioned. * See https://unicode-org.github.io/icu/userguide/icu4c/packaging.html |
︙ | ︙ | |||
508 509 510 511 512 513 514 | #if defined(__CYGWIN__) i = 2; #else i = 0; #endif while (iculibs[i] != NULL) { Tcl_ResetResult(interp); | | > | | | | | | | | | > | | | | | | | | > | > > | | < | > > | | 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 | #if defined(__CYGWIN__) i = 2; #else i = 0; #endif while (iculibs[i] != NULL) { Tcl_ResetResult(interp); nameobj = Tcl_NewStringObj(iculibs[i], TCL_AUTO_LENGTH); char *nameStr = Tcl_GetString(nameobj); char *p = strchr(nameStr, '?'); if (p != NULL) { memcpy(p, icuversion+1, 2); } Tcl_IncrRefCount(nameobj); if (Tcl_LoadFile(interp, nameobj, NULL, 0, NULL, &icu_fns.libs[0]) == TCL_OK) { if (p == NULL) { icuversion[0] = '\0'; } Tcl_DecrRefCount(nameobj); break; } Tcl_DecrRefCount(nameobj); ++i; } } if (icu_fns.libs[0] != NULL) { /* Loaded icuuc, load others with the same version */ nameobj = Tcl_ObjPrintf(DLLNAME, "i18n", icuversion+1); Tcl_IncrRefCount(nameobj); /* Ignore errors. Calls to contained functions will fail. */ (void) Tcl_LoadFile(interp, nameobj, NULL, 0, NULL, &icu_fns.libs[1]); Tcl_DecrRefCount(nameobj); } #ifdef _WIN32 /* * On Windows, if no ICU install found, look for the system's * (Win10 1703 or later). There are two cases. Newer systems * have icu.dll containing all functions. Older systems have * icucc.dll and icuin.dll */ if (icu_fns.libs[0] == NULL) { Tcl_ResetResult(interp); nameobj = Tcl_NewStringObj("icu.dll", TCL_AUTO_LENGTH); Tcl_IncrRefCount(nameobj); if (Tcl_LoadFile(interp, nameobj, NULL, 0, NULL, &icu_fns.libs[0]) == TCL_OK) { /* Reload same for second set of functions. */ (void) Tcl_LoadFile(interp, nameobj, NULL, 0, NULL, &icu_fns.libs[1]); /* Functions do NOT have version suffixes */ icuversion[0] = '\0'; } Tcl_DecrRefCount(nameobj); } if (icu_fns.libs[0] == NULL) { /* No icu.dll. Try last fallback */ Tcl_ResetResult(interp); nameobj = Tcl_NewStringObj("icuuc.dll", TCL_AUTO_LENGTH); Tcl_IncrRefCount(nameobj); if (Tcl_LoadFile(interp, nameobj, NULL, 0, NULL, &icu_fns.libs[0]) == TCL_OK) { Tcl_DecrRefCount(nameobj); nameobj = Tcl_NewStringObj("icuin.dll", TCL_AUTO_LENGTH); Tcl_IncrRefCount(nameobj); (void) Tcl_LoadFile(interp, nameobj, NULL, 0, NULL, &icu_fns.libs[1]); /* Functions do NOT have version suffixes */ icuversion[0] = '\0'; } Tcl_DecrRefCount(nameobj); } #endif // _WIN32 /* Symbol may have version (Windows, FreeBSD), or not (Linux) */ #define ICUUC_SYM(name) \ do { \ icu_fns._##name = \ (fn_##name)IcuFindSymbol(icu_fns.libs[0], #name, icuversion); \ } while (0) if (icu_fns.libs[0] != NULL) { ICUUC_SYM(u_cleanup); ICUUC_SYM(u_errorName); ICUUC_SYM(ucnv_countAliases); ICUUC_SYM(ucnv_countAvailable); ICUUC_SYM(ucnv_getAlias); |
︙ | ︙ | |||
602 603 604 605 606 607 608 | ICUUC_SYM(uenum_close); ICUUC_SYM(uenum_count); ICUUC_SYM(uenum_next); #undef ICUUC_SYM } | | | < | > > | | < < < < | < | < < | < | < < | < | < < | > | > | | | | | | | | | | 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 | ICUUC_SYM(uenum_close); ICUUC_SYM(uenum_count); ICUUC_SYM(uenum_next); #undef ICUUC_SYM } #define ICUIN_SYM(name) \ do { \ icu_fns._##name = \ (fn_##name)IcuFindSymbol(icu_fns.libs[1], #name, icuversion); \ } while (0) if (icu_fns.libs[1] != NULL) { ICUIN_SYM(ucsdet_close); ICUIN_SYM(ucsdet_detect); ICUIN_SYM(ucsdet_detectAll); ICUIN_SYM(ucsdet_getName); ICUIN_SYM(ucsdet_getAllDetectableCharsets); ICUIN_SYM(ucsdet_open); ICUIN_SYM(ucsdet_setText); #undef ICUIN_SYM } } if (icu_fns.libs[0] != NULL) { /* * Note refcounts updated BEFORE command definition to protect * against self redefinition. */ if (icu_fns.libs[1] != NULL) { /* Commands needing both libraries */ /* Ref count number of commands */ icu_fns.nopen += 1; Tcl_CreateObjCommand(interp, "::tcl::unsupported::icu::detect", IcuDetectObjCmd, 0, TclIcuCleanup); } /* Commands needing only libs[0] (icuuc) */ /* Ref count number of commands */ icu_fns.nopen += 2; Tcl_CreateObjCommand(interp, "::tcl::unsupported::icu::converters", IcuConverterNamesObjCmd, 0, TclIcuCleanup); Tcl_CreateObjCommand(interp, "::tcl::unsupported::icu::aliases", IcuConverterAliasesObjCmd, 0, TclIcuCleanup); } Tcl_MutexUnlock(&icu_mutex); } /* *------------------------------------------------------------------------ * * TclLoadIcuObjCmd -- * * Loads and initializes ICU * * Results: * TCL_OK - Success. * TCL_ERROR - Error. * * Side effects: * Interpreter result holds result or error message. * *------------------------------------------------------------------------ */ int TclLoadIcuObjCmd( TCL_UNUSED(void *), Tcl_Interp *interp, /* Current interpreter. */ int objc, /* Number of arguments. */ Tcl_Obj *const objv[]) /* Argument objects. */ { if (objc != 1) { Tcl_WrongNumArgs(interp, 1 , objv, ""); return TCL_ERROR; } TclIcuInit(interp); return TCL_OK; } /* * Local Variables: * mode: c * c-basic-offset: 4 * fill-column: 78 * coding: utf-8 * End: */ |
Changes to generic/tclIndexObj.c.
︙ | ︙ | |||
825 826 827 828 829 830 831 | Tcl_AppendObjToObj(objPtr, Tcl_GetObjResult(interp)); Tcl_AppendToObj(objPtr, " or \"", TCL_INDEX_NONE); } else { Tcl_AppendToObj(objPtr, "wrong # args: should be \"", TCL_INDEX_NONE); } /* | | | 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 | Tcl_AppendObjToObj(objPtr, Tcl_GetObjResult(interp)); Tcl_AppendToObj(objPtr, " or \"", TCL_INDEX_NONE); } else { Tcl_AppendToObj(objPtr, "wrong # args: should be \"", TCL_INDEX_NONE); } /* * If processing an ensemble implementation, rewrite the results in * terms of how the ensemble was invoked. */ if (iPtr->ensembleRewrite.sourceObjs != NULL) { Tcl_Size toSkip = iPtr->ensembleRewrite.numInsertedObjs; Tcl_Size toPrint = iPtr->ensembleRewrite.numRemovedObjs; Tcl_Obj *const *origObjv = TclEnsembleGetRewriteValues(interp); |
︙ | ︙ |
Changes to generic/tclInt.h.
︙ | ︙ | |||
216 217 218 219 220 221 222 | * Special hashtable for variables: This is just a Tcl_HashTable with nsPtr * and arrayPtr fields added at the end so that variables can find their * namespace and possibly containing array without having to copy a pointer in * their struct by accessing them via their hPtr->tablePtr. */ typedef struct TclVarHashTable { | | | | > | 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 | * Special hashtable for variables: This is just a Tcl_HashTable with nsPtr * and arrayPtr fields added at the end so that variables can find their * namespace and possibly containing array without having to copy a pointer in * their struct by accessing them via their hPtr->tablePtr. */ typedef struct TclVarHashTable { Tcl_HashTable table; /* "Inherit" from Tcl_HashTable. */ struct Namespace *nsPtr; /* The namespace containing the variables. */ #if TCL_MAJOR_VERSION > 8 struct Var *arrayPtr; /* The array containing the variables, if they * are variables in an array at all. */ #endif /* TCL_MAJOR_VERSION > 8 */ } TclVarHashTable; /* * This is for itcl - it likes to search our varTables directly :( */ |
︙ | ︙ | |||
628 629 630 631 632 633 634 | * to in a procedure, or a variable created by * "upvar", this field points to the * referenced variable's Var struct. */ } value; } Var; typedef struct VarInHash { | | | 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 | * to in a procedure, or a variable created by * "upvar", this field points to the * referenced variable's Var struct. */ } value; } Var; typedef struct VarInHash { Var var; /* "Inherit" from Var. */ Tcl_Size refCount; /* Counts number of active uses of this * variable: 1 for the entry in the hash * table, 1 for each additional variable whose * linkPtr points here, 1 for each nested * trace active on variable, and 1 if the * variable is a namespace variable. This * record can't be deleted until refCount |
︙ | ︙ | |||
1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 | static inline Tcl_Size TclObjTypeLength( Tcl_Obj *objPtr) { Tcl_ObjTypeLengthProc *proc = TclObjTypeHasProc(objPtr, lengthProc); return proc(objPtr); } static inline int TclObjTypeIndex( Tcl_Interp *interp, Tcl_Obj *objPtr, Tcl_Size index, Tcl_Obj **elemObjPtr) { Tcl_ObjTypeIndexProc *proc = TclObjTypeHasProc(objPtr, indexProc); return proc(interp, objPtr, index, elemObjPtr); } static inline int TclObjTypeSlice( Tcl_Interp *interp, Tcl_Obj *objPtr, Tcl_Size fromIdx, Tcl_Size toIdx, Tcl_Obj **newObjPtr) { Tcl_ObjTypeSliceProc *proc = TclObjTypeHasProc(objPtr, sliceProc); return proc(interp, objPtr, fromIdx, toIdx, newObjPtr); } static inline int TclObjTypeReverse( Tcl_Interp *interp, Tcl_Obj *objPtr, Tcl_Obj **newObjPtr) { Tcl_ObjTypeReverseProc *proc = TclObjTypeHasProc(objPtr, reverseProc); return proc(interp, objPtr, newObjPtr); } static inline int TclObjTypeGetElements( Tcl_Interp *interp, Tcl_Obj *objPtr, Tcl_Size *objCPtr, Tcl_Obj ***objVPtr) { Tcl_ObjTypeGetElements *proc = TclObjTypeHasProc(objPtr, getElementsProc); return proc(interp, objPtr, objCPtr, objVPtr); } static inline Tcl_Obj* TclObjTypeSetElement( Tcl_Interp *interp, Tcl_Obj *objPtr, Tcl_Size indexCount, Tcl_Obj *const indexArray[], Tcl_Obj *valueObj) { Tcl_ObjTypeSetElement *proc = TclObjTypeHasProc(objPtr, setElementProc); return proc(interp, objPtr, indexCount, indexArray, valueObj); } static inline int TclObjTypeReplace( Tcl_Interp *interp, Tcl_Obj *objPtr, Tcl_Size first, Tcl_Size numToDelete, Tcl_Size numToInsert, Tcl_Obj *const insertObjs[]) { Tcl_ObjTypeReplaceProc *proc = TclObjTypeHasProc(objPtr, replaceProc); return proc(interp, objPtr, first, numToDelete, numToInsert, insertObjs); } static inline int TclObjTypeInOperator( Tcl_Interp *interp, Tcl_Obj *valueObj, Tcl_Obj *listObj, int *boolResult) { | > > > > > > > | 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 | static inline Tcl_Size TclObjTypeLength( Tcl_Obj *objPtr) { Tcl_ObjTypeLengthProc *proc = TclObjTypeHasProc(objPtr, lengthProc); return proc(objPtr); } static inline int TclObjTypeIndex( Tcl_Interp *interp, Tcl_Obj *objPtr, Tcl_Size index, Tcl_Obj **elemObjPtr) { Tcl_ObjTypeIndexProc *proc = TclObjTypeHasProc(objPtr, indexProc); return proc(interp, objPtr, index, elemObjPtr); } static inline int TclObjTypeSlice( Tcl_Interp *interp, Tcl_Obj *objPtr, Tcl_Size fromIdx, Tcl_Size toIdx, Tcl_Obj **newObjPtr) { Tcl_ObjTypeSliceProc *proc = TclObjTypeHasProc(objPtr, sliceProc); return proc(interp, objPtr, fromIdx, toIdx, newObjPtr); } static inline int TclObjTypeReverse( Tcl_Interp *interp, Tcl_Obj *objPtr, Tcl_Obj **newObjPtr) { Tcl_ObjTypeReverseProc *proc = TclObjTypeHasProc(objPtr, reverseProc); return proc(interp, objPtr, newObjPtr); } static inline int TclObjTypeGetElements( Tcl_Interp *interp, Tcl_Obj *objPtr, Tcl_Size *objCPtr, Tcl_Obj ***objVPtr) { Tcl_ObjTypeGetElements *proc = TclObjTypeHasProc(objPtr, getElementsProc); return proc(interp, objPtr, objCPtr, objVPtr); } static inline Tcl_Obj* TclObjTypeSetElement( Tcl_Interp *interp, Tcl_Obj *objPtr, Tcl_Size indexCount, Tcl_Obj *const indexArray[], Tcl_Obj *valueObj) { Tcl_ObjTypeSetElement *proc = TclObjTypeHasProc(objPtr, setElementProc); return proc(interp, objPtr, indexCount, indexArray, valueObj); } static inline int TclObjTypeReplace( Tcl_Interp *interp, Tcl_Obj *objPtr, Tcl_Size first, Tcl_Size numToDelete, Tcl_Size numToInsert, Tcl_Obj *const insertObjs[]) { Tcl_ObjTypeReplaceProc *proc = TclObjTypeHasProc(objPtr, replaceProc); return proc(interp, objPtr, first, numToDelete, numToInsert, insertObjs); } static inline int TclObjTypeInOperator( Tcl_Interp *interp, Tcl_Obj *valueObj, Tcl_Obj *listObj, int *boolResult) { |
︙ | ︙ | |||
1226 1227 1228 1229 1230 1231 1232 | /* * Will be grown to contain: pointers to the varnames (allocated at the end), * plus the init values for each variable (suitable to be memcopied on init) */ typedef struct LocalCache { | | | | | 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 | /* * Will be grown to contain: pointers to the varnames (allocated at the end), * plus the init values for each variable (suitable to be memcopied on init) */ typedef struct LocalCache { Tcl_Size refCount; /* Reference count. */ Tcl_Size numVars; /* Number of variables. */ Tcl_Obj *varName0; /* First variable name. */ } LocalCache; #define localName(framePtr, i) \ ((&((framePtr)->localCachePtr->varName0))[(i)]) MODULE_SCOPE void TclFreeLocalCache(Tcl_Interp *interp, LocalCache *localCachePtr); |
︙ | ︙ | |||
1289 1290 1291 1292 1293 1294 1295 | * of this field is defined by the code that * sets it, and it should only ever be set by * the code that is pushing the frame. In that * case, the code that sets it should also * have some means of discovering what the * meaning of the value is, which we do not * specify. */ | | > > | | | 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 | * of this field is defined by the code that * sets it, and it should only ever be set by * the code that is pushing the frame. In that * case, the code that sets it should also * have some means of discovering what the * meaning of the value is, which we do not * specify. */ LocalCache *localCachePtr; /* Pointer to the start of the cached variable * names and initialisation data for local * variables. */ Tcl_Obj *tailcallPtr; /* NULL if no tailcall is scheduled */ } CallFrame; #define FRAME_IS_PROC 0x1 /* Frame is a procedure body. */ #define FRAME_IS_LAMBDA 0x2 /* Frame is a lambda term body. */ #define FRAME_IS_METHOD 0x4 /* The frame is a method body, and the frame's * clientData field contains a CallContext * reference. Part of TIP#257. */ #define FRAME_IS_OO_DEFINE 0x8 /* The frame is part of the inside workings of * the [oo::define] command; the clientData * field contains an Object reference that has * been confirmed to refer to a class. Part of |
︙ | ︙ | |||
1335 1336 1337 1338 1339 1340 1341 | * General data. Always available. */ int type; /* Values see below. */ int level; /* Number of frames in stack, prevent O(n) * scan of list. */ Tcl_Size *line; /* Lines the words of the command start on. */ | | | 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 | * General data. Always available. */ int type; /* Values see below. */ int level; /* Number of frames in stack, prevent O(n) * scan of list. */ Tcl_Size *line; /* Lines the words of the command start on. */ Tcl_Size nline; /* Number of lines in CmdFrame.line. */ CallFrame *framePtr; /* Procedure activation record, may be * NULL. */ struct CmdFrame *nextPtr; /* Link to calling frame. */ /* * Data needed for Eval vs TEBC * * EXECUTION CONTEXTS and usage of CmdFrame |
︙ | ︙ | |||
1565 1566 1567 1568 1569 1570 1571 | * SetByteCodeFromAny. */ typedef int (CompileHookProc)(Tcl_Interp *interp, struct CompileEnv *compEnvPtr, void *clientData); /* | | > > > | | | | | > > > > > > > > > > > > > < < < < < < < | > | > | > > | 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 | * SetByteCodeFromAny. */ typedef int (CompileHookProc)(Tcl_Interp *interp, struct CompileEnv *compEnvPtr, void *clientData); /* * The data structure for a (linked list of) execution stacks. Note that the * first word on a particular execution stack is NULL, which is used as a * marker to say "go to the previous stack in the list" when unwinding the * stack. */ typedef struct ExecStack { struct ExecStack *prevPtr; /* Previous stack in list. */ struct ExecStack *nextPtr; /* Next stack in list. */ Tcl_Obj **markerPtr; /* The location of the NULL marker. */ Tcl_Obj **endPtr; /* Where the stack end is. */ Tcl_Obj **tosPtr; /* Where the stack top is. */ Tcl_Obj *stackWords[TCLFLEXARRAY]; /* The actual stack space, following this * structure in memory. */ } ExecStack; /* * Saved copies of the stack frame references from the interpreter. Have to be * restored into the interpreter to be used. */ typedef struct CorContext { CallFrame *framePtr; /* See Interp.framePtr */ CallFrame *varFramePtr; /* See Interp.varFramePtr */ CmdFrame *cmdFramePtr; /* See Interp.cmdFramePtr */ Tcl_HashTable *lineLABCPtr; /* See Interp.lineLABCPtr */ } CorContext; /* * The data structure defining the execution environment for ByteCode's. * There is one ExecEnv structure per Tcl interpreter. It holds the evaluation * stack that holds command operands and results. The stack grows towards * increasing addresses. The member stackPtr points to the stackItems of the * currently active execution stack. */ typedef struct CoroutineData { struct Command *cmdPtr; /* The command handle for the coroutine. */ struct ExecEnv *eePtr; /* The special execution environment (stacks, * etc.) for the coroutine. */ struct ExecEnv *callerEEPtr;/* The execution environment for the caller of * the coroutine, which might be the * interpreter global environment or another * coroutine. */ CorContext caller; /* Caller's saved execution context. */ CorContext running; /* This coroutine's saved execution context. */ Tcl_HashTable *lineLABCPtr; /* See Interp.lineLABCPtr */ void *stackLevel; /* C stack frame reference. Used to try to * ensure we don't overflow that stack. */ Tcl_Size auxNumLevels; /* While the coroutine is running the * numLevels of the create/resume command is * stored here; for suspended coroutines it * holds the nesting numLevels at yield. */ Tcl_Size nargs; /* Number of args required for resuming this * coroutine; COROUTINE_ARGUMENTS_SINGLE_OPTIONAL * means "0 or 1" (default), * COROUTINE_ARGUMENTS_ARBITRARY means "any" */ Tcl_Obj *yieldPtr; /* The command to yield to. Stored here in * order to reset splice point in * TclNRCoroutineActivateCallback if the * coroutine is busy. */ } CoroutineData; typedef struct ExecEnv { ExecStack *execStackPtr; /* Points to the first item in the evaluation * stack on the heap. */ Tcl_Obj *constants[2]; /* Pointers to constant "0" and "1" objs. */ struct Tcl_Interp *interp; /* Owning interpreter. */ struct NRE_callback *callbackPtr; /* Top callback in NRE's stack. */ struct CoroutineData *corPtr; /* Current coroutine. */ int rewind; /* Set when exception trapping is disabled * because a context is being deleted (e.g., * the current coroutine has been deleted). */ } ExecEnv; #define COR_IS_SUSPENDED(corPtr) \ ((corPtr)->stackLevel == NULL) /* * The definitions for the LiteralTable and LiteralEntry structures. Each |
︙ | ︙ | |||
1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 | * of hidden commands on a per-interp * basis. */ void *interpInfo; /* Information used by tclInterp.c to keep * track of parent/child interps on a * per-interp basis. */ #if TCL_MAJOR_VERSION > 8 void (*optimizer)(void *envPtr); #else union { void (*optimizer)(void *envPtr); Tcl_HashTable unused2; /* No longer used (was mathFuncTable). The * unused space in interp was repurposed for * pluggable bytecode optimizers. The core * contains one optimizer, which can be | > > | 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 | * of hidden commands on a per-interp * basis. */ void *interpInfo; /* Information used by tclInterp.c to keep * track of parent/child interps on a * per-interp basis. */ #if TCL_MAJOR_VERSION > 8 void (*optimizer)(void *envPtr); /* Reference to the bytecode optimizer, if one * is set. */ #else union { void (*optimizer)(void *envPtr); Tcl_HashTable unused2; /* No longer used (was mathFuncTable). The * unused space in interp was repurposed for * pluggable bytecode optimizers. The core * contains one optimizer, which can be |
︙ | ︙ | |||
2252 2253 2254 2255 2256 2257 2258 | * Note that these are the same for all interps in the same thread. They * just have to be initialised for the thread's parent interp, children * inherit the value. * * They are used by the macros defined below. */ | | | 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 | * Note that these are the same for all interps in the same thread. They * just have to be initialised for the thread's parent interp, children * inherit the value. * * They are used by the macros defined below. */ AllocCache *allocCache; /* Allocator cache for stack frames. */ void *pendingObjDataPtr; /* Pointer to the Cache and PendingObjData * structs for this interp's thread; see * tclObj.c and tclThreadAlloc.c */ int *asyncReadyPtr; /* Pointer to the asyncReady indicator for * this interp's thread; see tclAsync.c */ /* * The pointer to the object system root ekeko. c.f. TIP #257. |
︙ | ︙ | |||
2287 2288 2289 2290 2291 2292 2293 | Tcl_Obj *asyncCancelMsg; /* Error message set by async cancel handler * for the propagation of arbitrary Tcl * errors. This information, if present * (asyncCancelMsg not NULL), takes precedence * over the default error messages returned by * a script cancellation operation. */ | | | | | 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 | Tcl_Obj *asyncCancelMsg; /* Error message set by async cancel handler * for the propagation of arbitrary Tcl * errors. This information, if present * (asyncCancelMsg not NULL), takes precedence * over the default error messages returned by * a script cancellation operation. */ /* * TIP #348 IMPLEMENTATION - Substituted error stack */ Tcl_Obj *errorStack; /* [info errorstack] value (as a Tcl_Obj). */ Tcl_Obj *upLiteral; /* "UP" literal for [info errorstack] */ Tcl_Obj *callLiteral; /* "CALL" literal for [info errorstack] */ Tcl_Obj *innerLiteral; /* "INNER" literal for [info errorstack] */ Tcl_Obj *innerContext; /* cached list for fast reallocation */ int resetErrorStack; /* controls cleaning up of ::errorStack */ |
︙ | ︙ | |||
2900 2901 2902 2903 2904 2905 2906 | */ typedef void (TclInitProcessGlobalValueProc)(char **valuePtr, TCL_HASH_TYPE *lengthPtr, Tcl_Encoding *encodingPtr); #ifdef _WIN32 | > | | > | 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 | */ typedef void (TclInitProcessGlobalValueProc)(char **valuePtr, TCL_HASH_TYPE *lengthPtr, Tcl_Encoding *encodingPtr); #ifdef _WIN32 /* On Windows, all Unicode (except surrogates) are valid. */ # define TCLFSENCODING tclUtf8Encoding #else /* On Non-Windows, use the system encoding for validation checks. */ # define TCLFSENCODING NULL #endif /* * A ProcessGlobalValue struct exists for each internal value in Tcl that is * to be shared among several threads. Each thread sees a (Tcl_Obj) copy of * the value, and the gobal value is kept as a counted string, with epoch and * mutex control. Each ProcessGlobalValue struct should be a static variable in |
︙ | ︙ | |||
2979 2980 2981 2982 2983 2984 2985 | *---------------------------------------------------------------------- * Common functions for calculating overallocation. Trivial but allows for * experimenting with growth factors without having to change code in * multiple places. See TclAttemptAllocElemsEx and similar for usage * examples. Best to use those functions. Direct use of TclUpsizeAlloc / * TclResizeAlloc is needed in special cases such as when total size of * memory block is limited to less than TCL_SIZE_MAX. | < > > > > > > > > | 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 | *---------------------------------------------------------------------- * Common functions for calculating overallocation. Trivial but allows for * experimenting with growth factors without having to change code in * multiple places. See TclAttemptAllocElemsEx and similar for usage * examples. Best to use those functions. Direct use of TclUpsizeAlloc / * TclResizeAlloc is needed in special cases such as when total size of * memory block is limited to less than TCL_SIZE_MAX. *---------------------------------------------------------------------- */ static inline Tcl_Size TclUpsizeAlloc( TCL_UNUSED(Tcl_Size), /* oldSize. For future experiments with * some growth algorithms that use this * information. */ Tcl_Size needed, Tcl_Size limit) { /* assert (oldCapacity < needed <= limit) */ if (needed < (limit - needed/2)) { return needed + needed / 2; } else { return limit; } } static inline Tcl_Size TclUpsizeRetry( Tcl_Size needed, Tcl_Size lastAttempt) { /* assert(needed < lastAttempt); */ if (needed < lastAttempt - 1) { /* (needed+lastAttempt)/2 but that formula may overflow Tcl_Size */ return needed + (lastAttempt - needed) / 2; } else { return needed; } } MODULE_SCOPE void * TclAllocElemsEx(Tcl_Size elemCount, Tcl_Size elemSize, Tcl_Size leadSize, Tcl_Size *capacityPtr); MODULE_SCOPE void * TclReallocElemsEx(void *oldPtr, Tcl_Size elemCount, Tcl_Size elemSize, Tcl_Size leadSize, Tcl_Size *capacityPtr); MODULE_SCOPE void * TclAttemptReallocElemsEx(void *oldPtr, Tcl_Size elemCount, Tcl_Size elemSize, Tcl_Size leadSize, Tcl_Size *capacityPtr); /* Alloc elemCount elements of size elemSize with leadSize header * returning actual capacity (in elements) in *capacityPtr. */ static inline void * TclAttemptAllocElemsEx( Tcl_Size elemCount, Tcl_Size elemSize, Tcl_Size leadSize, Tcl_Size *capacityPtr) { return TclAttemptReallocElemsEx( NULL, elemCount, elemSize, leadSize, capacityPtr); } /* Alloc numByte bytes, returning actual capacity in *capacityPtr. */ static inline void * TclAllocEx( Tcl_Size numBytes, Tcl_Size *capacityPtr) { return TclAllocElemsEx(numBytes, 1, 0, capacityPtr); } /* Alloc numByte bytes, returning actual capacity in *capacityPtr. */ static inline void * TclAttemptAllocEx( Tcl_Size numBytes, Tcl_Size *capacityPtr) { return TclAttemptAllocElemsEx(numBytes, 1, 0, capacityPtr); } /* Realloc numByte bytes, returning actual capacity in *capacityPtr. */ static inline void * TclReallocEx( void *oldPtr, Tcl_Size numBytes, Tcl_Size *capacityPtr) { return TclReallocElemsEx(oldPtr, numBytes, 1, 0, capacityPtr); } /* Realloc numByte bytes, returning actual capacity in *capacityPtr. */ static inline void * TclAttemptReallocEx( void *oldPtr, Tcl_Size numBytes, Tcl_Size *capacityPtr) { |
︙ | ︙ | |||
3287 3288 3289 3290 3291 3292 3293 | MODULE_SCOPE int TclChannelGetBlockingMode(Tcl_Channel chan); MODULE_SCOPE int TclCheckArrayTraces(Tcl_Interp *interp, Var *varPtr, Var *arrayPtr, Tcl_Obj *name, int index); MODULE_SCOPE int TclCheckEmptyString(Tcl_Obj *objPtr); MODULE_SCOPE int TclChanCaughtErrorBypass(Tcl_Interp *interp, Tcl_Channel chan); MODULE_SCOPE Tcl_ObjCmdProc TclChannelNamesCmd; | | | 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 | MODULE_SCOPE int TclChannelGetBlockingMode(Tcl_Channel chan); MODULE_SCOPE int TclCheckArrayTraces(Tcl_Interp *interp, Var *varPtr, Var *arrayPtr, Tcl_Obj *name, int index); MODULE_SCOPE int TclCheckEmptyString(Tcl_Obj *objPtr); MODULE_SCOPE int TclChanCaughtErrorBypass(Tcl_Interp *interp, Tcl_Channel chan); MODULE_SCOPE Tcl_ObjCmdProc TclChannelNamesCmd; MODULE_SCOPE int TclChanIsBinary(Tcl_Channel chan); MODULE_SCOPE Tcl_NRPostProc TclClearRootEnsemble; MODULE_SCOPE int TclCompareTwoNumbers(Tcl_Obj *valuePtr, Tcl_Obj *value2Ptr); MODULE_SCOPE ContLineLoc *TclContinuationsEnter(Tcl_Obj *objPtr, Tcl_Size num, Tcl_Size *loc); MODULE_SCOPE void TclContinuationsEnterDerived(Tcl_Obj *objPtr, Tcl_Size start, Tcl_Size *clNext); |
︙ | ︙ | |||
3401 3402 3403 3404 3405 3406 3407 | MODULE_SCOPE Tcl_Obj * TclGetProcessGlobalValue(ProcessGlobalValue *pgvPtr); MODULE_SCOPE Tcl_Obj * TclGetSourceFromFrame(CmdFrame *cfPtr, Tcl_Size objc, Tcl_Obj *const objv[]); MODULE_SCOPE char * TclGetStringStorage(Tcl_Obj *objPtr, Tcl_Size *sizePtr); MODULE_SCOPE int TclGetLoadedLibraries(Tcl_Interp *interp, const char *targetName, | | | 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 | MODULE_SCOPE Tcl_Obj * TclGetProcessGlobalValue(ProcessGlobalValue *pgvPtr); MODULE_SCOPE Tcl_Obj * TclGetSourceFromFrame(CmdFrame *cfPtr, Tcl_Size objc, Tcl_Obj *const objv[]); MODULE_SCOPE char * TclGetStringStorage(Tcl_Obj *objPtr, Tcl_Size *sizePtr); MODULE_SCOPE int TclGetLoadedLibraries(Tcl_Interp *interp, const char *targetName, const char *prefix); MODULE_SCOPE int TclGetWideBitsFromObj(Tcl_Interp *, Tcl_Obj *, Tcl_WideInt *); MODULE_SCOPE int TclCompareStringKeys(void *keyPtr, Tcl_HashEntry *hPtr); MODULE_SCOPE size_t TclHashStringKey(Tcl_HashTable *tablePtr, void *keyPtr); MODULE_SCOPE int TclIncrObj(Tcl_Interp *interp, Tcl_Obj *valuePtr, Tcl_Obj *incrPtr); MODULE_SCOPE Tcl_Obj * TclIncrObjVar2(Tcl_Interp *interp, Tcl_Obj *part1Ptr, |
︙ | ︙ | |||
3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 | MODULE_SCOPE Tcl_Obj * TclpTempFileNameForLibrary(Tcl_Interp *interp, Tcl_Obj* pathPtr); MODULE_SCOPE Tcl_Obj * TclNewArithSeriesObj(Tcl_Interp *interp, int useDoubles, Tcl_Obj *startObj, Tcl_Obj *endObj, Tcl_Obj *stepObj, Tcl_Obj *lenObj); MODULE_SCOPE Tcl_Obj * TclNewFSPathObj(Tcl_Obj *dirPtr, const char *addStrRep, Tcl_Size len); MODULE_SCOPE void TclpAlertNotifier(void *clientData); MODULE_SCOPE void * TclpNotifierData(void); MODULE_SCOPE void TclpServiceModeHook(int mode); MODULE_SCOPE void TclpSetTimer(const Tcl_Time *timePtr); MODULE_SCOPE int TclpWaitForEvent(const Tcl_Time *timePtr); MODULE_SCOPE void TclpCreateFileHandler(int fd, int mask, Tcl_FileProc *proc, void *clientData); | > | 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 | MODULE_SCOPE Tcl_Obj * TclpTempFileNameForLibrary(Tcl_Interp *interp, Tcl_Obj* pathPtr); MODULE_SCOPE Tcl_Obj * TclNewArithSeriesObj(Tcl_Interp *interp, int useDoubles, Tcl_Obj *startObj, Tcl_Obj *endObj, Tcl_Obj *stepObj, Tcl_Obj *lenObj); MODULE_SCOPE Tcl_Obj * TclNewFSPathObj(Tcl_Obj *dirPtr, const char *addStrRep, Tcl_Size len); MODULE_SCOPE Tcl_Obj * TclNewNamespaceObj(Tcl_Namespace *namespacePtr); MODULE_SCOPE void TclpAlertNotifier(void *clientData); MODULE_SCOPE void * TclpNotifierData(void); MODULE_SCOPE void TclpServiceModeHook(int mode); MODULE_SCOPE void TclpSetTimer(const Tcl_Time *timePtr); MODULE_SCOPE int TclpWaitForEvent(const Tcl_Time *timePtr); MODULE_SCOPE void TclpCreateFileHandler(int fd, int mask, Tcl_FileProc *proc, void *clientData); |
︙ | ︙ | |||
3655 3656 3657 3658 3659 3660 3661 | # define TCL_WIDE_CLICKS 1 MODULE_SCOPE long long TclpGetWideClicks(void); MODULE_SCOPE double TclpWideClickInMicrosec(void); # define TclpWideClicksToNanoseconds(clicks) \ ((double)(clicks) * TclpWideClickInMicrosec() * 1000) # endif #endif | | | 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 | # define TCL_WIDE_CLICKS 1 MODULE_SCOPE long long TclpGetWideClicks(void); MODULE_SCOPE double TclpWideClickInMicrosec(void); # define TclpWideClicksToNanoseconds(clicks) \ ((double)(clicks) * TclpWideClickInMicrosec() * 1000) # endif #endif MODULE_SCOPE long long TclpGetMicroseconds(void); MODULE_SCOPE int TclZlibInit(Tcl_Interp *interp); MODULE_SCOPE void * TclpThreadCreateKey(void); MODULE_SCOPE void TclpThreadDeleteKey(void *keyPtr); MODULE_SCOPE void TclpThreadSetGlobalTSD(void *tsdKeyPtr, void *ptr); MODULE_SCOPE void * TclpThreadGetGlobalTSD(void *tsdKeyPtr); MODULE_SCOPE void TclErrorStackResetIf(Tcl_Interp *interp, |
︙ | ︙ | |||
4091 4092 4093 4094 4095 4096 4097 | } TclProcessWaitStatus; MODULE_SCOPE Tcl_Command TclInitProcessCmd(Tcl_Interp *interp); MODULE_SCOPE void TclProcessCreated(Tcl_Pid pid); MODULE_SCOPE TclProcessWaitStatus TclProcessWait(Tcl_Pid pid, int options, int *codePtr, Tcl_Obj **msgObjPtr, Tcl_Obj **errorObjPtr); | | | 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 4138 4139 4140 | } TclProcessWaitStatus; MODULE_SCOPE Tcl_Command TclInitProcessCmd(Tcl_Interp *interp); MODULE_SCOPE void TclProcessCreated(Tcl_Pid pid); MODULE_SCOPE TclProcessWaitStatus TclProcessWait(Tcl_Pid pid, int options, int *codePtr, Tcl_Obj **msgObjPtr, Tcl_Obj **errorObjPtr); MODULE_SCOPE int TclClose(Tcl_Interp *, Tcl_Channel chan); /* * TIP #508: [array default] */ MODULE_SCOPE void TclInitArrayVar(Var *arrayPtr); MODULE_SCOPE Tcl_Obj * TclGetArrayDefault(Var *arrayPtr); |
︙ | ︙ |
Changes to generic/tclInterp.c.
︙ | ︙ | |||
133 134 135 136 137 138 139 140 141 142 143 144 145 146 | Target *targetsPtr; /* The head of a doubly-linked list of all the * target records which denote aliases from * children or sibling interpreters that direct * to commands in this interpreter. This list * is used to remove dangling pointers from * the child (or sibling) interpreters when * this interpreter is deleted. */ } Parent; /* * The following structure keeps track of all the Parent and Child information * on a per-interp basis. */ | > > > > | 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 | Target *targetsPtr; /* The head of a doubly-linked list of all the * target records which denote aliases from * children or sibling interpreters that direct * to commands in this interpreter. This list * is used to remove dangling pointers from * the child (or sibling) interpreters when * this interpreter is deleted. */ Tcl_Size idIssuer; /* Used to issue a sequence of names for * "unnamed" child interpreters. We keep a * count here to avoid having to scan over IDs * for interpreters that we've already used. */ } Parent; /* * The following structure keeps track of all the Parent and Child information * on a per-interp basis. */ |
︙ | ︙ | |||
192 193 194 195 196 197 198 | LimitHandler *prevPtr; /* Previous item in linked list of * handlers. */ LimitHandler *nextPtr; /* Next item in linked list of handlers. */ }; /* * Values for the LimitHandler flags field. | > > | | | | | | | > > > > | < > | | | | 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 | LimitHandler *prevPtr; /* Previous item in linked list of * handlers. */ LimitHandler *nextPtr; /* Next item in linked list of handlers. */ }; /* * Values for the LimitHandler flags field. */ enum LimitHandlerFlags { LIMIT_HANDLER_ACTIVE = 1, /* The handler is currently being processed; * handlers are never to be reentered. */ LIMIT_HANDLER_DELETED = 2 /* The handler has been deleted. This should * not normally be observed because when a * handler is deleted it is also spliced out of * the list of handlers, but even so we will be * careful.*/ }; /* * Macro to make looking up child and parent info more convenient. */ #define INTERP_INFO(interp) \ ((InterpInfo *) ((Interp *) (interp))->interpInfo) /* * Prototypes for local static functions: */ static int AliasCreate(Tcl_Interp *interp, Tcl_Interp *childInterp, Tcl_Interp *parentInterp, Tcl_Obj *namePtr, Tcl_Obj *targetPtr, Tcl_Size objc, Tcl_Obj *const objv[]); static int AliasDelete(Tcl_Interp *interp, Tcl_Interp *childInterp, Tcl_Obj *namePtr); static int AliasDescribe(Tcl_Interp *interp, Tcl_Interp *childInterp, Tcl_Obj *objPtr); static int AliasList(Tcl_Interp *interp, Tcl_Interp *childInterp); static Tcl_ObjCmdProc AliasNRCmd; static Tcl_CmdDeleteProc AliasObjCmdDeleteProc; static Tcl_Interp * GetInterp(Tcl_Interp *interp, Tcl_Obj *pathPtr); static Tcl_Interp * GetInterp2(Tcl_Interp *interp, Tcl_Size objc, Tcl_Obj *const objv[]); static Tcl_InterpDeleteProc InterpInfoDeleteProc; static int ChildBgerror(Tcl_Interp *interp, Tcl_Interp *childInterp, Tcl_Size objc, Tcl_Obj *const objv[]); static Tcl_Interp * ChildCreate(Tcl_Interp *interp, Tcl_Obj *pathPtr, int safe); static int ChildDebugCmd(Tcl_Interp *interp, Tcl_Interp *childInterp, |
︙ | ︙ | |||
317 318 319 320 321 322 323 | * * Side effects: * Depends on what's in the init.tcl script. * *---------------------------------------------------------------------- */ | < < < < < > > > > > > > > > > > > | | > | 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 | * * Side effects: * Depends on what's in the init.tcl script. * *---------------------------------------------------------------------- */ int Tcl_Init( Tcl_Interp *interp) /* Interpreter to initialize. */ { /* * Splice for putting the "tcl" package in the list of packages while the * pre-init and init scripts are running. The real version of this struct * is in tclPkg.c. */ typedef struct PkgName { struct PkgName *nextPtr;/* Next in list of package names being * initialized. */ char name[4]; /* Enough space for "tcl". The *real* version * of this structure uses a flex array. */ } PkgName; PkgName pkgName = {NULL, "tcl"}; PkgName **names = (PkgName **) TclInitPkgFiles(interp); int result = TCL_ERROR; pkgName.nextPtr = *names; *names = &pkgName; if (tclPreInitScript != NULL) { if (Tcl_EvalEx(interp, tclPreInitScript, TCL_INDEX_NONE, 0 /*flags*/) == TCL_ERROR) { goto end; } } /* * In order to find init.tcl during initialization, the following script * is invoked by Tcl_Init(). It looks in several different directories: |
︙ | ︙ | |||
436 437 438 439 440 441 442 | " continue\n" " }\n" " unset -nocomplain tclDefaultLibrary\n" " return\n" " }\n" " }\n" " unset -nocomplain tclDefaultLibrary\n" | | | | 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 | " continue\n" " }\n" " unset -nocomplain tclDefaultLibrary\n" " return\n" " }\n" " }\n" " unset -nocomplain tclDefaultLibrary\n" " set msg \"Cannot find a usable init.tcl in the following directories: \n\"\n" " append msg \" $dirs\n\n\"\n" " append msg \"$errors\n\n\"\n" " append msg \"This probably means that Tcl wasn't installed properly.\n\"\n" " error $msg\n" " }\n" "}\n" "tclInit", TCL_INDEX_NONE, 0); TclpSetInitialEncodings(); end: *names = (*names)->nextPtr; return result; } /* *--------------------------------------------------------------------------- |
︙ | ︙ | |||
476 477 478 479 480 481 482 | TclInterpInit( Tcl_Interp *interp) /* Interpreter to initialize. */ { InterpInfo *interpInfoPtr; Parent *parentPtr; Child *childPtr; | | > | 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 | TclInterpInit( Tcl_Interp *interp) /* Interpreter to initialize. */ { InterpInfo *interpInfoPtr; Parent *parentPtr; Child *childPtr; interpInfoPtr = (InterpInfo *) Tcl_Alloc(sizeof(InterpInfo)); ((Interp *) interp)->interpInfo = interpInfoPtr; parentPtr = &interpInfoPtr->parent; Tcl_InitHashTable(&parentPtr->childTable, TCL_STRING_KEYS); parentPtr->targetsPtr = NULL; parentPtr->idIssuer = 0; childPtr = &interpInfoPtr->child; childPtr->parentInterp = NULL; childPtr->childEntryPtr = NULL; childPtr->childInterp = interp; childPtr->interpCmd = NULL; Tcl_InitHashTable(&childPtr->aliasTable, TCL_STRING_KEYS); |
︙ | ︙ | |||
520 521 522 523 524 525 526 | static void InterpInfoDeleteProc( TCL_UNUSED(void *), Tcl_Interp *interp) /* Interp being deleted. All commands for * child interps should already be deleted. */ { | | < < > | 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 | static void InterpInfoDeleteProc( TCL_UNUSED(void *), Tcl_Interp *interp) /* Interp being deleted. All commands for * child interps should already be deleted. */ { InterpInfo *interpInfoPtr = INTERP_INFO(interp); Child *childPtr; Parent *parentPtr; Target *targetPtr; /* * There shouldn't be any commands left. */ parentPtr = &interpInfoPtr->parent; if (parentPtr->childTable.numEntries != 0) { Tcl_Panic("InterpInfoDeleteProc: still exist commands"); } Tcl_DeleteHashTable(&parentPtr->childTable); /* * Tell any interps that have aliases to this interp that they should * delete those aliases. If the other interp was already dead, it would * have removed the target record already. */ for (targetPtr = parentPtr->targetsPtr; targetPtr != NULL; ) { Target *tmpPtr = targetPtr->nextPtr; Tcl_DeleteCommandFromToken(targetPtr->childInterp, targetPtr->childCmd); targetPtr = tmpPtr; } childPtr = &interpInfoPtr->child; if (childPtr->interpCmd != NULL) { |
︙ | ︙ | |||
596 597 598 599 600 601 602 | * *---------------------------------------------------------------------- */ int Tcl_InterpObjCmd( void *clientData, | | | | | | | | 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 | * *---------------------------------------------------------------------- */ int Tcl_InterpObjCmd( void *clientData, Tcl_Interp *interp, /* Current interpreter. */ int objc, /* Number of arguments. */ Tcl_Obj *const objv[]) /* Argument objects. */ { return Tcl_NRCallObjProc(interp, NRInterpCmd, clientData, objc, objv); } static int NRInterpCmd( TCL_UNUSED(void *), Tcl_Interp *interp, /* Current interpreter. */ int objc, /* Number of arguments. */ Tcl_Obj *const objv[]) /* Argument objects. */ { Tcl_Interp *childInterp; static const char *const options[] = { "alias", "aliases", "bgerror", "cancel", "children", "create", "debug", "delete", "eval", "exists", "expose", "hide", "hidden", "issafe", "invokehidden", |
︙ | ︙ | |||
643 644 645 646 647 648 649 650 651 652 653 654 | OPT_HIDDEN, OPT_ISSAFE, OPT_INVOKEHID, OPT_LIMIT, OPT_MARKTRUSTED, OPT_RECLIMIT, OPT_SHARE, #ifndef TCL_NO_DEPRECATED OPT_SLAVES, #endif OPT_TARGET, OPT_TRANSFER } index; if (objc < 2) { Tcl_WrongNumArgs(interp, 1, objv, "cmd ?arg ...?"); return TCL_ERROR; } | > | | | < < < > | > > > < | < < | 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 | OPT_HIDDEN, OPT_ISSAFE, OPT_INVOKEHID, OPT_LIMIT, OPT_MARKTRUSTED, OPT_RECLIMIT, OPT_SHARE, #ifndef TCL_NO_DEPRECATED OPT_SLAVES, #endif OPT_TARGET, OPT_TRANSFER } index; Tcl_Size i; if (objc < 2) { Tcl_WrongNumArgs(interp, 1, objv, "cmd ?arg ...?"); return TCL_ERROR; } if (Tcl_GetIndexFromObj(NULL, objv[1], options, NULL, 0, &index) != TCL_OK) { /* Don't report the "slaves" option as possibility */ Tcl_GetIndexFromObj(interp, objv[1], optionsNoSlaves, "option", 0, &index); return TCL_ERROR; } switch (index) { case OPT_ALIAS: { Tcl_Interp *parentInterp; if (objc < 4) { goto aliasArgs; } childInterp = GetInterp(interp, objv[2]); if (childInterp == NULL) { return TCL_ERROR; } if (objc == 4) { return AliasDescribe(interp, childInterp, objv[3]); } if ((objc == 5) && (TclGetString(objv[4])[0] == '\0')) { return AliasDelete(interp, childInterp, objv[3]); } if (objc > 5) { parentInterp = GetInterp(interp, objv[4]); if (parentInterp == NULL) { return TCL_ERROR; } return AliasCreate(interp, childInterp, parentInterp, objv[3], objv[5], objc - 6, objv + 6); } aliasArgs: Tcl_WrongNumArgs(interp, 2, objv, "childPath childCmd ?parentPath parentCmd? ?arg ...?"); return TCL_ERROR; } case OPT_ALIASES: childInterp = GetInterp2(interp, objc, objv); if (childInterp == NULL) { return TCL_ERROR; } return AliasList(interp, childInterp); case OPT_BGERROR: if (objc != 3 && objc != 4) { Tcl_WrongNumArgs(interp, 2, objv, "path ?cmdPrefix?"); return TCL_ERROR; } childInterp = GetInterp(interp, objv[2]); if (childInterp == NULL) { return TCL_ERROR; } return ChildBgerror(interp, childInterp, objc - 3, objv + 3); case OPT_CANCEL: { int flags = 0; Tcl_Obj *resultObjPtr; static const char *const cancelOptions[] = { "-unwind", "--", NULL }; enum optionCancelEnum { OPT_UNWIND, OPT_LAST } idx; for (i = 2; i < objc; i++) { if (TclGetString(objv[i])[0] != '-') { break; } if (Tcl_GetIndexFromObj(interp, objv[i], cancelOptions, "option", 0, &idx) != TCL_OK) { return TCL_ERROR; |
︙ | ︙ | |||
777 778 779 780 781 782 783 | resultObjPtr = NULL; } return Tcl_CancelEval(childInterp, resultObjPtr, 0, flags); } case OPT_CREATE: { int last, safe; | < | 794 795 796 797 798 799 800 801 802 803 804 805 806 807 | resultObjPtr = NULL; } return Tcl_CancelEval(childInterp, resultObjPtr, 0, flags); } case OPT_CREATE: { int last, safe; Tcl_Obj *childPtr; char buf[16 + TCL_INTEGER_SPACE]; static const char *const createOptions[] = { "-safe", "--", NULL }; enum option { OPT_SAFE, OPT_LAST |
︙ | ︙ | |||
818 819 820 821 822 823 824 825 826 827 828 829 830 831 | } if (i < objc) { childPtr = objv[i]; } } buf[0] = '\0'; if (childPtr == NULL) { /* * Create an anonymous interpreter -- we choose its name and the * name of the command. We check that the command name that we use * for the interpreter does not collide with an existing command * in the parent interpreter. */ | > > > < < | | > | < < < < | < < | | 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 | } if (i < objc) { childPtr = objv[i]; } } buf[0] = '\0'; if (childPtr == NULL) { Parent *parentInfo = &INTERP_INFO(interp)->parent; Tcl_CmdInfo cmdInfo; /* * Create an anonymous interpreter -- we choose its name and the * name of the command. We check that the command name that we use * for the interpreter does not collide with an existing command * in the parent interpreter. */ do { snprintf(buf, sizeof(buf), "interp%" TCL_SIZE_MODIFIER "d", parentInfo->idIssuer++); } while (Tcl_GetCommandInfo(interp, buf, &cmdInfo)); childPtr = Tcl_NewStringObj(buf, -1); } if (ChildCreate(interp, childPtr, safe) == NULL) { Tcl_BounceRefCount(childPtr); return TCL_ERROR; } Tcl_SetObjResult(interp, childPtr); return TCL_OK; } case OPT_DEBUG: /* TIP #378 */ /* * Currently only -frame supported, otherwise ?-option ?value?? */ if (objc < 3 || objc > 5) { Tcl_WrongNumArgs(interp, 2, objv, "path ?-frame ?bool??"); return TCL_ERROR; } childInterp = GetInterp(interp, objv[2]); if (childInterp == NULL) { return TCL_ERROR; } return ChildDebugCmd(interp, childInterp, objc - 3, objv + 3); case OPT_DELETE: { InterpInfo *iiPtr; for (i = 2; i < objc; i++) { childInterp = GetInterp(interp, objv[i]); if (childInterp == NULL) { return TCL_ERROR; } else if (childInterp == interp) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "cannot delete the current interpreter", -1)); Tcl_SetErrorCode(interp, "TCL", "OPERATION", "INTERP", "DELETESELF", (char *)NULL); return TCL_ERROR; } iiPtr = INTERP_INFO(childInterp); Tcl_DeleteCommandFromToken(iiPtr->child.parentInterp, iiPtr->child.interpCmd); } return TCL_OK; } case OPT_EVAL: if (objc < 4) { |
︙ | ︙ | |||
937 938 939 940 941 942 943 | childInterp = GetInterp2(interp, objc, objv); if (childInterp == NULL) { return TCL_ERROR; } Tcl_SetObjResult(interp, Tcl_NewBooleanObj(Tcl_IsSafe(childInterp))); return TCL_OK; case OPT_INVOKEHID: { | < | 949 950 951 952 953 954 955 956 957 958 959 960 961 962 | childInterp = GetInterp2(interp, objc, objv); if (childInterp == NULL) { return TCL_ERROR; } Tcl_SetObjResult(interp, Tcl_NewBooleanObj(Tcl_IsSafe(childInterp))); return TCL_OK; case OPT_INVOKEHID: { const char *namespaceName; static const char *const hiddenOptions[] = { "-global", "-namespace", "--", NULL }; enum hiddenOption { OPT_GLOBAL, OPT_NAMESPACE, OPT_LAST } idx; |
︙ | ︙ | |||
1006 1007 1008 1009 1010 1011 1012 1013 1014 | return TCL_ERROR; } switch (limitType) { case LIMIT_TYPE_COMMANDS: return ChildCommandLimitCmd(interp, childInterp, 4, objc,objv); case LIMIT_TYPE_TIME: return ChildTimeLimitCmd(interp, childInterp, 4, objc, objv); } } | > > > < | 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 | return TCL_ERROR; } switch (limitType) { case LIMIT_TYPE_COMMANDS: return ChildCommandLimitCmd(interp, childInterp, 4, objc,objv); case LIMIT_TYPE_TIME: return ChildTimeLimitCmd(interp, childInterp, 4, objc, objv); default: Tcl_Panic("unreachable"); return TCL_ERROR; } } case OPT_MARKTRUSTED: if (objc != 3) { Tcl_WrongNumArgs(interp, 2, objv, "path"); return TCL_ERROR; } childInterp = GetInterp(interp, objv[2]); if (childInterp == NULL) { |
︙ | ︙ | |||
1043 1044 1045 1046 1047 1048 1049 | Tcl_HashSearch hashSearch; char *string; childInterp = GetInterp2(interp, objc, objv); if (childInterp == NULL) { return TCL_ERROR; } | | | | 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 | Tcl_HashSearch hashSearch; char *string; childInterp = GetInterp2(interp, objc, objv); if (childInterp == NULL) { return TCL_ERROR; } iiPtr = INTERP_INFO(childInterp); TclNewObj(resultPtr); hPtr = Tcl_FirstHashEntry(&iiPtr->parent.childTable, &hashSearch); for ( ; hPtr != NULL; hPtr = Tcl_NextHashEntry(&hashSearch)) { string = (char *) Tcl_GetHashKey(&iiPtr->parent.childTable, hPtr); Tcl_ListObjAppendElement(NULL, resultPtr, Tcl_NewStringObj(string, -1)); } Tcl_SetObjResult(interp, resultPtr); return TCL_OK; } case OPT_TRANSFER: |
︙ | ︙ | |||
1108 1109 1110 1111 1112 1113 1114 | childInterp = GetInterp(interp, objv[2]); if (childInterp == NULL) { return TCL_ERROR; } aliasName = TclGetString(objv[3]); | | | > > > < | 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 | childInterp = GetInterp(interp, objv[2]); if (childInterp == NULL) { return TCL_ERROR; } aliasName = TclGetString(objv[3]); iiPtr = INTERP_INFO(childInterp); hPtr = Tcl_FindHashEntry(&iiPtr->child.aliasTable, aliasName); if (hPtr == NULL) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "alias \"%s\" in path \"%s\" not found", aliasName, TclGetString(objv[2]))); Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "ALIAS", aliasName, (char *)NULL); return TCL_ERROR; } aliasPtr = (Alias *) Tcl_GetHashValue(hPtr); if (Tcl_GetInterpPath(interp, aliasPtr->targetInterp) != TCL_OK) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "target interpreter for alias \"%s\" in path \"%s\" is " "not my descendant", aliasName, TclGetString(objv[2]))); Tcl_SetErrorCode(interp, "TCL", "OPERATION", "INTERP", "TARGETSHROUDED", (char *)NULL); return TCL_ERROR; } return TCL_OK; } default: Tcl_Panic("unreachable"); return TCL_ERROR; } } /* *--------------------------------------------------------------------------- * * GetInterp2 -- * |
︙ | ︙ | |||
1158 1159 1160 1161 1162 1163 1164 | *--------------------------------------------------------------------------- */ static Tcl_Interp * GetInterp2( Tcl_Interp *interp, /* Default interp if no interp was specified * on the command line. */ | | | 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 | *--------------------------------------------------------------------------- */ static Tcl_Interp * GetInterp2( Tcl_Interp *interp, /* Default interp if no interp was specified * on the command line. */ Tcl_Size objc, /* Number of arguments. */ Tcl_Obj *const objv[]) /* Argument objects. */ { if (objc == 2) { return interp; } else if (objc == 3) { return GetInterp(interp, objv[2]); } else { |
︙ | ︙ | |||
1193 1194 1195 1196 1197 1198 1199 | int Tcl_CreateAlias( Tcl_Interp *childInterp, /* Interpreter for source command. */ const char *childCmd, /* Command to install in child. */ Tcl_Interp *targetInterp, /* Interpreter for target command. */ const char *targetCmd, /* Name of target command. */ | | | | 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 | int Tcl_CreateAlias( Tcl_Interp *childInterp, /* Interpreter for source command. */ const char *childCmd, /* Command to install in child. */ Tcl_Interp *targetInterp, /* Interpreter for target command. */ const char *targetCmd, /* Name of target command. */ Tcl_Size argc, /* How many additional arguments? */ const char *const *argv) /* These are the additional args. */ { Tcl_Obj *childObjPtr, *targetObjPtr; Tcl_Obj **objv; Tcl_Size i; int result; objv = (Tcl_Obj **) TclStackAlloc(childInterp, sizeof(Tcl_Obj *) * argc); for (i = 0; i < argc; i++) { objv[i] = Tcl_NewStringObj(argv[i], -1); Tcl_IncrRefCount(objv[i]); } childObjPtr = Tcl_NewStringObj(childCmd, -1); Tcl_IncrRefCount(childObjPtr); |
︙ | ︙ | |||
1248 1249 1250 1251 1252 1253 1254 | int Tcl_CreateAliasObj( Tcl_Interp *childInterp, /* Interpreter for source command. */ const char *childCmd, /* Command to install in child. */ Tcl_Interp *targetInterp, /* Interpreter for target command. */ const char *targetCmd, /* Name of target command. */ | | | 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 | int Tcl_CreateAliasObj( Tcl_Interp *childInterp, /* Interpreter for source command. */ const char *childCmd, /* Command to install in child. */ Tcl_Interp *targetInterp, /* Interpreter for target command. */ const char *targetCmd, /* Name of target command. */ Tcl_Size objc, /* How many additional arguments? */ Tcl_Obj *const objv[]) /* Argument vector. */ { Tcl_Obj *childObjPtr, *targetObjPtr; int result; childObjPtr = Tcl_NewStringObj(childCmd, -1); Tcl_IncrRefCount(childObjPtr); |
︙ | ︙ | |||
1294 1295 1296 1297 1298 1299 1300 | const char *aliasName, /* Name of alias to find. */ Tcl_Interp **targetInterpPtr, /* (Return) target interpreter. */ const char **targetCmdPtr, /* (Return) name of target command. */ Tcl_Size *objcPtr, /* (Return) count of addnl args. */ Tcl_Obj ***objvPtr) /* (Return) additional args. */ { | | | > | | 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 | const char *aliasName, /* Name of alias to find. */ Tcl_Interp **targetInterpPtr, /* (Return) target interpreter. */ const char **targetCmdPtr, /* (Return) name of target command. */ Tcl_Size *objcPtr, /* (Return) count of addnl args. */ Tcl_Obj ***objvPtr) /* (Return) additional args. */ { InterpInfo *iiPtr = INTERP_INFO(interp); Tcl_HashEntry *hPtr; Alias *aliasPtr; Tcl_Size objc; Tcl_Obj **objv; hPtr = Tcl_FindHashEntry(&iiPtr->child.aliasTable, aliasName); if (hPtr == NULL) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "alias \"%s\" not found", aliasName)); Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "ALIAS", aliasName, (char *)NULL); return TCL_ERROR; } aliasPtr = (Alias *) Tcl_GetHashValue(hPtr); objc = aliasPtr->objc; objv = &aliasPtr->objPtr; if (targetInterpPtr != NULL) { *targetInterpPtr = aliasPtr->targetInterp; } if (targetCmdPtr != NULL) { |
︙ | ︙ | |||
1376 1377 1378 1379 1380 1381 1382 | /* * OK, we are dealing with an alias, so traverse the chain of aliases. If * we encounter the alias we are defining (or renaming to) any in the * chain then we have a loop. */ | | | 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 | /* * OK, we are dealing with an alias, so traverse the chain of aliases. If * we encounter the alias we are defining (or renaming to) any in the * chain then we have a loop. */ aliasPtr = (Alias *) cmdPtr->objClientData; nextAliasPtr = aliasPtr; while (1) { Tcl_Obj *cmdNamePtr; /* * If the target of the next alias in the chain is the same as the * source alias, we have a loop. |
︙ | ︙ | |||
1425 1426 1427 1428 1429 1430 1431 | * Otherwise we do not have a loop. */ if (aliasCmdPtr->objProc != TclAliasObjCmd && aliasCmdPtr->objProc != TclLocalAliasObjCmd) { return TCL_OK; } | | | 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 | * Otherwise we do not have a loop. */ if (aliasCmdPtr->objProc != TclAliasObjCmd && aliasCmdPtr->objProc != TclLocalAliasObjCmd) { return TCL_OK; } nextAliasPtr = (Alias *) aliasCmdPtr->objClientData; } } /* *---------------------------------------------------------------------- * * AliasCreate -- |
︙ | ︙ | |||
1455 1456 1457 1458 1459 1460 1461 | Tcl_Interp *interp, /* Interp for error reporting. */ Tcl_Interp *childInterp, /* Interp where alias cmd will live or from * which alias will be deleted. */ Tcl_Interp *parentInterp, /* Interp in which target command will be * invoked. */ Tcl_Obj *namePtr, /* Name of alias cmd. */ Tcl_Obj *targetCmdPtr, /* Name of target cmd. */ | | | | 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 | Tcl_Interp *interp, /* Interp for error reporting. */ Tcl_Interp *childInterp, /* Interp where alias cmd will live or from * which alias will be deleted. */ Tcl_Interp *parentInterp, /* Interp in which target command will be * invoked. */ Tcl_Obj *namePtr, /* Name of alias cmd. */ Tcl_Obj *targetCmdPtr, /* Name of target cmd. */ Tcl_Size objc, /* Additional arguments to store */ Tcl_Obj *const objv[]) /* with alias. */ { Alias *aliasPtr; Tcl_HashEntry *hPtr; Target *targetPtr; Child *childPtr; Parent *parentPtr; Tcl_Obj **prefv; int isNew; Tcl_Size i; aliasPtr = (Alias *) Tcl_Alloc(sizeof(Alias) + objc * sizeof(Tcl_Obj *)); aliasPtr->token = namePtr; Tcl_IncrRefCount(aliasPtr->token); aliasPtr->targetInterp = parentInterp; aliasPtr->objc = objc + 1; prefv = &aliasPtr->objPtr; |
︙ | ︙ | |||
1533 1534 1535 1536 1537 1538 1539 | return TCL_ERROR; } /* * Make an entry in the alias table. If it already exists, retry. */ | | | 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 | return TCL_ERROR; } /* * Make an entry in the alias table. If it already exists, retry. */ childPtr = &INTERP_INFO(childInterp)->child; while (1) { Tcl_Obj *newToken; const char *string; string = TclGetString(aliasPtr->token); hPtr = Tcl_CreateHashEntry(&childPtr->aliasTable, string, &isNew); if (isNew != 0) { |
︙ | ︙ | |||
1575 1576 1577 1578 1579 1580 1581 | * because the alias may be pointing at a renamed alias, as in: * * interp alias {} foo {} bar # Create an alias "foo" * rename foo zop # Now rename the alias * interp alias {} foo {} zop # Now recreate "foo"... */ | | | | 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 | * because the alias may be pointing at a renamed alias, as in: * * interp alias {} foo {} bar # Create an alias "foo" * rename foo zop # Now rename the alias * interp alias {} foo {} zop # Now recreate "foo"... */ targetPtr = (Target *) Tcl_Alloc(sizeof(Target)); targetPtr->childCmd = aliasPtr->childCmd; targetPtr->childInterp = childInterp; parentPtr = &INTERP_INFO(parentInterp)->parent; targetPtr->nextPtr = parentPtr->targetsPtr; targetPtr->prevPtr = NULL; if (parentPtr->targetsPtr != NULL) { parentPtr->targetsPtr->prevPtr = targetPtr; } parentPtr->targetsPtr = targetPtr; aliasPtr->targetPtr = targetPtr; |
︙ | ︙ | |||
1627 1628 1629 1630 1631 1632 1633 | /* * If the alias has been renamed in the child, the parent can still use * the original name (with which it was created) to find the alias to * delete it. */ | | | | 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 | /* * If the alias has been renamed in the child, the parent can still use * the original name (with which it was created) to find the alias to * delete it. */ childPtr = &INTERP_INFO(childInterp)->child; hPtr = Tcl_FindHashEntry(&childPtr->aliasTable, TclGetString(namePtr)); if (hPtr == NULL) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "alias \"%s\" not found", TclGetString(namePtr))); Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "ALIAS", TclGetString(namePtr), (char *)NULL); return TCL_ERROR; } aliasPtr = (Alias *) Tcl_GetHashValue(hPtr); Tcl_DeleteCommandFromToken(childInterp, aliasPtr->childCmd); return TCL_OK; } /* *---------------------------------------------------------------------- * |
︙ | ︙ | |||
1676 1677 1678 1679 1680 1681 1682 | /* * If the alias has been renamed in the child, the parent can still use * the original name (with which it was created) to find the alias to * describe it. */ | | | | 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 | /* * If the alias has been renamed in the child, the parent can still use * the original name (with which it was created) to find the alias to * describe it. */ childPtr = &INTERP_INFO(childInterp)->child; hPtr = Tcl_FindHashEntry(&childPtr->aliasTable, TclGetString(namePtr)); if (hPtr == NULL) { return TCL_OK; } aliasPtr = (Alias *) Tcl_GetHashValue(hPtr); prefixPtr = Tcl_NewListObj(aliasPtr->objc, &aliasPtr->objPtr); Tcl_SetObjResult(interp, prefixPtr); return TCL_OK; } /* *---------------------------------------------------------------------- |
︙ | ︙ | |||
1715 1716 1717 1718 1719 1720 1721 | Tcl_HashEntry *entryPtr; Tcl_HashSearch hashSearch; Tcl_Obj *resultPtr; Alias *aliasPtr; Child *childPtr; TclNewObj(resultPtr); | | | | 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 | Tcl_HashEntry *entryPtr; Tcl_HashSearch hashSearch; Tcl_Obj *resultPtr; Alias *aliasPtr; Child *childPtr; TclNewObj(resultPtr); childPtr = &INTERP_INFO(childInterp)->child; entryPtr = Tcl_FirstHashEntry(&childPtr->aliasTable, &hashSearch); for ( ; entryPtr != NULL; entryPtr = Tcl_NextHashEntry(&hashSearch)) { aliasPtr = (Alias *) Tcl_GetHashValue(entryPtr); Tcl_ListObjAppendElement(NULL, resultPtr, aliasPtr->token); } Tcl_SetObjResult(interp, resultPtr); return TCL_OK; } /* |
︙ | ︙ | |||
1755 1756 1757 1758 1759 1760 1761 | * forwarded. * *---------------------------------------------------------------------- */ static int AliasNRCmd( | | | | 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 | * forwarded. * *---------------------------------------------------------------------- */ static int AliasNRCmd( void *clientData, /* Alias record. */ Tcl_Interp *interp, /* Current interpreter. */ int objc, /* Number of arguments. */ Tcl_Obj *const objv[]) /* Argument vector. */ { Alias *aliasPtr = (Alias *) clientData; Tcl_Size prefc, cmdc, i; Tcl_Obj **prefv, **cmdv; Tcl_Obj *listPtr; ListRep listRep; int flags = TCL_EVAL_INVOKE; /* |
︙ | ︙ | |||
1808 1809 1810 1811 1812 1813 1814 | } TclSkipTailcall(interp); return Tcl_NREvalObj(interp, listPtr, flags); } int TclAliasObjCmd( | | | < | | | 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 | } TclSkipTailcall(interp); return Tcl_NREvalObj(interp, listPtr, flags); } int TclAliasObjCmd( void *clientData, /* Alias record. */ Tcl_Interp *interp, /* Current interpreter. */ int objc, /* Number of arguments. */ Tcl_Obj *const objv[]) /* Argument vector. */ { #define ALIAS_CMDV_PREALLOC 10 Alias *aliasPtr = (Alias *) clientData; Tcl_Interp *targetInterp = aliasPtr->targetInterp; int result; Tcl_Size prefc, cmdc, i; Tcl_Obj **prefv, **cmdv; Tcl_Obj *cmdArr[ALIAS_CMDV_PREALLOC]; int isRootEnsemble; /* * Append the arguments to the command prefix and invoke the command in * the target interp's global namespace. */ prefc = aliasPtr->objc; prefv = &aliasPtr->objPtr; cmdc = prefc + objc - 1; if (cmdc <= ALIAS_CMDV_PREALLOC) { cmdv = cmdArr; } else { cmdv = (Tcl_Obj **) TclStackAlloc(interp, cmdc * sizeof(Tcl_Obj *)); } memcpy(cmdv, prefv, prefc * sizeof(Tcl_Obj *)); memcpy(cmdv+prefc, objv+1, (objc-1) * sizeof(Tcl_Obj *)); Tcl_ResetResult(targetInterp); for (i=0; i<cmdc; i++) { Tcl_IncrRefCount(cmdv[i]); } /* * Use the ensemble rewriting machinery to ensure correct error messages: * only the source command should show, not the full target prefix. */ isRootEnsemble = TclInitRewriteEnsemble(targetInterp, 1, prefc, objv); /* * Protect the target interpreter if it isn't the same as the source * interpreter so that we can continue to work with it after the target * command completes. */ |
︙ | ︙ | |||
1874 1875 1876 1877 1878 1879 1880 | result = Tcl_EvalObjv(targetInterp, cmdc, cmdv, TCL_EVAL_INVOKE); /* * Clean up the ensemble rewrite info if we set it in the first place. */ if (isRootEnsemble) { | | | 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 | result = Tcl_EvalObjv(targetInterp, cmdc, cmdv, TCL_EVAL_INVOKE); /* * Clean up the ensemble rewrite info if we set it in the first place. */ if (isRootEnsemble) { TclResetRewriteEnsemble(targetInterp, 1); } /* * If it was a cross-interpreter alias, we need to transfer the result * back to the source interpreter and release the lock we previously set * on the target interpreter. */ |
︙ | ︙ | |||
1900 1901 1902 1903 1904 1905 1906 | } return result; #undef ALIAS_CMDV_PREALLOC } int TclLocalAliasObjCmd( | | | < | | | | 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 | } return result; #undef ALIAS_CMDV_PREALLOC } int TclLocalAliasObjCmd( void *clientData, /* Alias record. */ Tcl_Interp *interp, /* Current interpreter. */ int objc, /* Number of arguments. */ Tcl_Obj *const objv[]) /* Argument vector. */ { #define ALIAS_CMDV_PREALLOC 10 Alias *aliasPtr = (Alias *) clientData; int result; Tcl_Size prefc, cmdc, i; Tcl_Obj **prefv, **cmdv; Tcl_Obj *cmdArr[ALIAS_CMDV_PREALLOC]; int isRootEnsemble; /* * Append the arguments to the command prefix and invoke the command in * the global namespace. */ prefc = aliasPtr->objc; prefv = &aliasPtr->objPtr; cmdc = prefc + objc - 1; if (cmdc <= ALIAS_CMDV_PREALLOC) { cmdv = cmdArr; } else { cmdv = (Tcl_Obj **) TclStackAlloc(interp, cmdc * sizeof(Tcl_Obj *)); } memcpy(cmdv, prefv, prefc * sizeof(Tcl_Obj *)); memcpy(cmdv+prefc, objv+1, (objc-1) * sizeof(Tcl_Obj *)); for (i=0; i<cmdc; i++) { Tcl_IncrRefCount(cmdv[i]); } /* * Use the ensemble rewriting machinery to ensure correct error messages: * only the source command should show, not the full target prefix. */ isRootEnsemble = TclInitRewriteEnsemble(interp, 1, prefc, objv); /* * Execute the target command in the target interpreter. */ result = Tcl_EvalObjv(interp, cmdc, cmdv, TCL_EVAL_INVOKE); /* * Clean up the ensemble rewrite info if we set it in the first place. */ if (isRootEnsemble) { TclResetRewriteEnsemble(interp, 1); } for (i=0; i<cmdc; i++) { Tcl_DecrRefCount(cmdv[i]); } if (cmdv != cmdArr) { TclStackFree(interp, cmdv); |
︙ | ︙ | |||
1986 1987 1988 1989 1990 1991 1992 | * interpreter. * *---------------------------------------------------------------------- */ static void AliasObjCmdDeleteProc( | | | < | | 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 | * interpreter. * *---------------------------------------------------------------------- */ static void AliasObjCmdDeleteProc( void *clientData) /* The alias record for this alias. */ { Alias *aliasPtr = (Alias *) clientData; Target *targetPtr; Tcl_Size i; Tcl_Obj **objv; Tcl_DecrRefCount(aliasPtr->token); objv = &aliasPtr->objPtr; for (i = 0; i < aliasPtr->objc; i++) { Tcl_DecrRefCount(objv[i]); } Tcl_DeleteHashEntry(aliasPtr->aliasEntryPtr); /* * Splice the target record out of the target interpreter's parent list. */ targetPtr = aliasPtr->targetPtr; if (targetPtr->prevPtr != NULL) { targetPtr->prevPtr->nextPtr = targetPtr->nextPtr; } else { Parent *parentPtr = &INTERP_INFO(aliasPtr->targetInterp)->parent; parentPtr->targetsPtr = targetPtr->nextPtr; } if (targetPtr->nextPtr != NULL) { targetPtr->nextPtr->prevPtr = targetPtr->prevPtr; } |
︙ | ︙ | |||
2116 2117 2118 2119 2120 2121 2122 | Tcl_Interp *interp) /* Get the parent of this interpreter. */ { Child *childPtr; /* Child record of this interpreter. */ if (interp == NULL) { return NULL; } | | | 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 | Tcl_Interp *interp) /* Get the parent of this interpreter. */ { Child *childPtr; /* Child record of this interpreter. */ if (interp == NULL) { return NULL; } childPtr = &INTERP_INFO(interp)->child; return childPtr->parentInterp; } /* *---------------------------------------------------------------------- * * TclSetChildCancelFlags -- |
︙ | ︙ | |||
2160 2161 2162 2163 2164 2165 2166 | if (interp == NULL) { return; } flags &= (CANCELED | TCL_CANCEL_UNWIND); | | | | 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 | if (interp == NULL) { return; } flags &= (CANCELED | TCL_CANCEL_UNWIND); parentPtr = &INTERP_INFO(interp)->parent; hPtr = Tcl_FirstHashEntry(&parentPtr->childTable, &hashSearch); for ( ; hPtr != NULL; hPtr = Tcl_NextHashEntry(&hashSearch)) { childPtr = (Child *) Tcl_GetHashValue(hPtr); iPtr = (Interp *) childPtr->childInterp; if (iPtr == NULL) { continue; } if (flags == 0) { |
︙ | ︙ | |||
2212 2213 2214 2215 2216 2217 2218 | * None. * *---------------------------------------------------------------------- */ int Tcl_GetInterpPath( | | | | | > | | 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 | * None. * *---------------------------------------------------------------------- */ int Tcl_GetInterpPath( Tcl_Interp *interp, /* Interpreter to start search from. */ Tcl_Interp *targetInterp) /* Interpreter to find. */ { InterpInfo *iiPtr; if (targetInterp == interp) { Tcl_SetObjResult(interp, Tcl_NewObj()); return TCL_OK; } if (targetInterp == NULL) { return TCL_ERROR; } iiPtr = INTERP_INFO(targetInterp); if (Tcl_GetInterpPath(interp, iiPtr->child.parentInterp) != TCL_OK) { return TCL_ERROR; } Tcl_ListObjAppendElement(NULL, Tcl_GetObjResult(interp), Tcl_NewStringObj((const char *) Tcl_GetHashKey(&iiPtr->parent.childTable, iiPtr->child.childEntryPtr), -1)); return TCL_OK; } /* *---------------------------------------------------------------------- * * GetInterp -- |
︙ | ︙ | |||
2270 2271 2272 2273 2274 2275 2276 | if (TclListObjGetElements(interp, pathPtr, &objc, &objv) != TCL_OK) { return NULL; } searchInterp = interp; for (i = 0; i < objc; i++) { | | | | 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 | if (TclListObjGetElements(interp, pathPtr, &objc, &objv) != TCL_OK) { return NULL; } searchInterp = interp; for (i = 0; i < objc; i++) { parentInfoPtr = INTERP_INFO(searchInterp); hPtr = Tcl_FindHashEntry(&parentInfoPtr->parent.childTable, TclGetString(objv[i])); if (hPtr == NULL) { searchInterp = NULL; break; } childPtr = (Child *) Tcl_GetHashValue(hPtr); searchInterp = childPtr->childInterp; if (searchInterp == NULL) { break; } } if (searchInterp == NULL) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( |
︙ | ︙ | |||
2314 2315 2316 2317 2318 2319 2320 | *---------------------------------------------------------------------- */ static int ChildBgerror( Tcl_Interp *interp, /* Interp for error return. */ Tcl_Interp *childInterp, /* Interp in which limit is set/queried. */ | | | 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 | *---------------------------------------------------------------------- */ static int ChildBgerror( Tcl_Interp *interp, /* Interp for error return. */ Tcl_Interp *childInterp, /* Interp in which limit is set/queried. */ Tcl_Size objc, /* Set or Query. */ Tcl_Obj *const objv[]) /* Argument strings. */ { if (objc) { Tcl_Size length; if (TCL_ERROR == TclListObjLength(NULL, objv[0], &length) || (length < 1)) { |
︙ | ︙ | |||
2389 2390 2391 2392 2393 2394 2395 | } path = TclGetString(objv[objc - 1]); } if (safe == 0) { safe = Tcl_IsSafe(parentInterp); } | | | | 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 | } path = TclGetString(objv[objc - 1]); } if (safe == 0) { safe = Tcl_IsSafe(parentInterp); } parentInfoPtr = INTERP_INFO(parentInterp); hPtr = Tcl_CreateHashEntry(&parentInfoPtr->parent.childTable, path, &isNew); if (isNew == 0) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "interpreter named \"%s\" already exists, cannot create", path)); return NULL; } childInterp = Tcl_CreateInterp(); childPtr = &INTERP_INFO(childInterp)->child; childPtr->parentInterp = parentInterp; childPtr->childEntryPtr = hPtr; childPtr->childInterp = childInterp; childPtr->interpCmd = Tcl_NRCreateCommand(parentInterp, path, TclChildObjCmd, NRChildCmd, childInterp, ChildObjCmdDeleteProc); Tcl_InitHashTable(&childPtr->aliasTable, TCL_STRING_KEYS); Tcl_SetHashValue(hPtr, childPtr); |
︙ | ︙ | |||
2487 2488 2489 2490 2491 2492 2493 | * See user documentation for details. * *---------------------------------------------------------------------- */ int TclChildObjCmd( | | | | | 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 | * See user documentation for details. * *---------------------------------------------------------------------- */ int TclChildObjCmd( void *clientData, /* Child interpreter. */ Tcl_Interp *interp, /* Current interpreter. */ int objc, /* Number of arguments. */ Tcl_Obj *const objv[]) /* Argument objects. */ { return Tcl_NRCallObjProc(interp, NRChildCmd, clientData, objc, objv); } static int NRChildCmd( void *clientData, /* Child interpreter. */ Tcl_Interp *interp, /* Current interpreter. */ int objc, /* Number of arguments. */ Tcl_Obj *const objv[]) /* Argument objects. */ { Tcl_Interp *childInterp = (Tcl_Interp *) clientData; static const char *const options[] = { "alias", "aliases", "bgerror", "debug", "eval", "expose", "hide", "hidden", "issafe", "invokehidden", "limit", "marktrusted", "recursionlimit", NULL }; enum childCmdOptionsEnum { |
︙ | ︙ | |||
2623 2624 2625 2626 2627 2628 2629 | return TCL_ERROR; } if (idx == OPT_GLOBAL) { namespaceName = "::"; } else if (idx == OPT_NAMESPACE) { if (++i == objc) { /* There must be more arguments. */ break; | < < > | 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 | return TCL_ERROR; } if (idx == OPT_GLOBAL) { namespaceName = "::"; } else if (idx == OPT_NAMESPACE) { if (++i == objc) { /* There must be more arguments. */ break; } namespaceName = TclGetString(objv[i]); } else { i++; break; } } if (objc - i < 1) { Tcl_WrongNumArgs(interp, 2, objv, |
︙ | ︙ | |||
2701 2702 2703 2704 2705 2706 2707 | * the child interpreter. * *---------------------------------------------------------------------- */ static void ChildObjCmdDeleteProc( | | | | | 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 | * the child interpreter. * *---------------------------------------------------------------------- */ static void ChildObjCmdDeleteProc( void *clientData) /* The ChildRecord for the command. */ { Child *childPtr; /* Interim storage for Child record. */ Tcl_Interp *childInterp = (Tcl_Interp *) clientData; /* And for a child interp. */ childPtr = &INTERP_INFO(childInterp)->child; /* * Unlink the child from its parent interpreter. */ Tcl_DeleteHashEntry(childPtr->childEntryPtr); |
︙ | ︙ | |||
2749 2750 2751 2752 2753 2754 2755 | */ static int ChildDebugCmd( Tcl_Interp *interp, /* Interp for error return. */ Tcl_Interp *childInterp, /* The child interpreter in which command * will be evaluated. */ | | | 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 | */ static int ChildDebugCmd( Tcl_Interp *interp, /* Interp for error return. */ Tcl_Interp *childInterp, /* The child interpreter in which command * will be evaluated. */ Tcl_Size objc, /* Number of arguments. */ Tcl_Obj *const objv[]) /* Argument objects. */ { static const char *const debugTypes[] = { "-frame", NULL }; enum DebugTypes { DEBUG_TYPE_FRAME |
︙ | ︙ | |||
2820 2821 2822 2823 2824 2825 2826 | */ static int ChildEval( Tcl_Interp *interp, /* Interp for error return. */ Tcl_Interp *childInterp, /* The child interpreter in which command * will be evaluated. */ | | | 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 | */ static int ChildEval( Tcl_Interp *interp, /* Interp for error return. */ Tcl_Interp *childInterp, /* The child interpreter in which command * will be evaluated. */ Tcl_Size objc, /* Number of arguments. */ Tcl_Obj *const objv[]) /* Argument objects. */ { int result; /* * TIP #285: If necessary, reset the cancellation flags for the child * interpreter now; otherwise, canceling a script in a parent interpreter |
︙ | ︙ | |||
2883 2884 2885 2886 2887 2888 2889 | *---------------------------------------------------------------------- */ static int ChildExpose( Tcl_Interp *interp, /* Interp for error return. */ Tcl_Interp *childInterp, /* Interp in which command will be exposed. */ | | | 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 | *---------------------------------------------------------------------- */ static int ChildExpose( Tcl_Interp *interp, /* Interp for error return. */ Tcl_Interp *childInterp, /* Interp in which command will be exposed. */ Tcl_Size objc, /* Number of arguments. */ Tcl_Obj *const objv[]) /* Argument strings. */ { const char *name; if (Tcl_IsSafe(interp)) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "permission denied: safe interpreter cannot expose commands", |
︙ | ︙ | |||
2927 2928 2929 2930 2931 2932 2933 | *---------------------------------------------------------------------- */ static int ChildRecursionLimit( Tcl_Interp *interp, /* Interp for error return. */ Tcl_Interp *childInterp, /* Interp in which limit is set/queried. */ | | | 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 | *---------------------------------------------------------------------- */ static int ChildRecursionLimit( Tcl_Interp *interp, /* Interp for error return. */ Tcl_Interp *childInterp, /* Interp in which limit is set/queried. */ Tcl_Size objc, /* Set or Query. */ Tcl_Obj *const objv[]) /* Argument strings. */ { Interp *iPtr; Tcl_WideInt limit; if (objc) { if (Tcl_IsSafe(interp)) { |
︙ | ︙ | |||
2989 2990 2991 2992 2993 2994 2995 | *---------------------------------------------------------------------- */ static int ChildHide( Tcl_Interp *interp, /* Interp for error return. */ Tcl_Interp *childInterp, /* Interp in which command will be exposed. */ | | | 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 | *---------------------------------------------------------------------- */ static int ChildHide( Tcl_Interp *interp, /* Interp for error return. */ Tcl_Interp *childInterp, /* Interp in which command will be exposed. */ Tcl_Size objc, /* Number of arguments. */ Tcl_Obj *const objv[]) /* Argument strings. */ { const char *name; if (Tcl_IsSafe(interp)) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "permission denied: safe interpreter cannot hide commands", |
︙ | ︙ | |||
3033 3034 3035 3036 3037 3038 3039 | */ static int ChildHidden( Tcl_Interp *interp, /* Interp for data return. */ Tcl_Interp *childInterp) /* Interp whose hidden commands to query. */ { | | | | | | > | 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 | */ static int ChildHidden( Tcl_Interp *interp, /* Interp for data return. */ Tcl_Interp *childInterp) /* Interp whose hidden commands to query. */ { Tcl_Obj *listObjPtr; /* Local object pointer. */ Tcl_HashTable *hTblPtr; /* For local searches. */ Tcl_HashEntry *hPtr; /* For local searches. */ Tcl_HashSearch hSearch; /* For local searches. */ TclNewObj(listObjPtr); hTblPtr = ((Interp *) childInterp)->hiddenCmdTablePtr; if (hTblPtr != NULL) { for (hPtr = Tcl_FirstHashEntry(hTblPtr, &hSearch); hPtr != NULL; hPtr = Tcl_NextHashEntry(&hSearch)) { Tcl_ListObjAppendElement(NULL, listObjPtr, Tcl_NewStringObj((const char *) Tcl_GetHashKey(hTblPtr, hPtr), -1)); } } Tcl_SetObjResult(interp, listObjPtr); return TCL_OK; } /* |
︙ | ︙ | |||
3074 3075 3076 3077 3078 3079 3080 | static int ChildInvokeHidden( Tcl_Interp *interp, /* Interp for error return. */ Tcl_Interp *childInterp, /* The child interpreter in which command will * be invoked. */ const char *namespaceName, /* The namespace to use, if any. */ | | | 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 | static int ChildInvokeHidden( Tcl_Interp *interp, /* Interp for error return. */ Tcl_Interp *childInterp, /* The child interpreter in which command will * be invoked. */ const char *namespaceName, /* The namespace to use, if any. */ Tcl_Size objc, /* Number of arguments. */ Tcl_Obj *const objv[]) /* Argument objects. */ { int result; if (Tcl_IsSafe(interp)) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "not allowed to invoke hidden commands from safe interpreter", |
︙ | ︙ | |||
3122 3123 3124 3125 3126 3127 3128 | static int NRPostInvokeHidden( void *data[], Tcl_Interp *interp, int result) { | | | | 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 | static int NRPostInvokeHidden( void *data[], Tcl_Interp *interp, int result) { Tcl_Interp *childInterp = (Tcl_Interp *) data[0]; NRE_callback *rootPtr = (NRE_callback *) data[1]; if (interp != childInterp) { result = TclNRRunCallbacks(childInterp, result, rootPtr); Tcl_TransferResult(childInterp, result, interp); } Tcl_Release(childInterp); return result; |
︙ | ︙ | |||
3221 3222 3223 3224 3225 3226 3227 | void MakeSafe( Tcl_Interp *interp) /* Interpreter to be made safe. */ { Tcl_Channel chan; /* Channel to remove from safe interpreter. */ Interp *iPtr = (Interp *) interp; | | | > | 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 | void MakeSafe( Tcl_Interp *interp) /* Interpreter to be made safe. */ { Tcl_Channel chan; /* Channel to remove from safe interpreter. */ Interp *iPtr = (Interp *) interp; Tcl_Interp *parent = INTERP_INFO(iPtr)->child.parentInterp; TclHideUnsafeCommands(interp); if (parent != NULL) { /* * Alias these function implementations in the child to those in the * parent; the overall implementations are safe, but they're normally * defined by init.tcl which is not sourced by safe interpreters. * Assume these functions all work. [Bug 2895741] */ (void) Tcl_EvalEx(interp, "namespace eval ::tcl {namespace eval mathfunc {}}", TCL_INDEX_NONE, 0); } iPtr->flags |= SAFE_INTERP; /* * Unsetting variables : (which should not have been set in the first * place, but...) |
︙ | ︙ | |||
3559 3560 3561 3562 3563 3564 3565 | deleteProc = TclpFree; } /* * Allocate a handler record. */ | | | 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 | deleteProc = TclpFree; } /* * Allocate a handler record. */ handlerPtr = (LimitHandler *) Tcl_Alloc(sizeof(LimitHandler)); handlerPtr->flags = 0; handlerPtr->handlerProc = handlerProc; handlerPtr->clientData = clientData; handlerPtr->deleteProc = deleteProc; handlerPtr->prevPtr = NULL; /* |
︙ | ︙ | |||
4016 4017 4018 4019 4020 4021 4022 | *---------------------------------------------------------------------- */ static void TimeLimitCallback( void *clientData) { | | | | 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 | *---------------------------------------------------------------------- */ static void TimeLimitCallback( void *clientData) { Tcl_Interp *interp = (Tcl_Interp *) clientData; Interp *iPtr = (Interp *) clientData; int code; Tcl_Preserve(interp); iPtr->limit.timeEvent = NULL; /* * Must reset the granularity ticker here to force an immediate full |
︙ | ︙ | |||
4160 4161 4162 4163 4164 4165 4166 | *---------------------------------------------------------------------- */ static void DeleteScriptLimitCallback( void *clientData) { | | | 4175 4176 4177 4178 4179 4180 4181 4182 4183 4184 4185 4186 4187 4188 4189 | *---------------------------------------------------------------------- */ static void DeleteScriptLimitCallback( void *clientData) { ScriptLimitCallback *limitCBPtr = (ScriptLimitCallback *) clientData; Tcl_DecrRefCount(limitCBPtr->scriptObj); if (limitCBPtr->entryPtr != NULL) { Tcl_DeleteHashEntry(limitCBPtr->entryPtr); } Tcl_Free(limitCBPtr); } |
︙ | ︙ | |||
4192 4193 4194 4195 4196 4197 4198 | */ static void CallScriptLimitCallback( void *clientData, TCL_UNUSED(Tcl_Interp *)) { | | | 4207 4208 4209 4210 4211 4212 4213 4214 4215 4216 4217 4218 4219 4220 4221 | */ static void CallScriptLimitCallback( void *clientData, TCL_UNUSED(Tcl_Interp *)) { ScriptLimitCallback *limitCBPtr = (ScriptLimitCallback *) clientData; int code; if (Tcl_InterpDeleted(limitCBPtr->interp)) { return; } Tcl_Preserve(limitCBPtr->interp); code = Tcl_EvalObjEx(limitCBPtr->interp, limitCBPtr->scriptObj, |
︙ | ︙ | |||
4260 4261 4262 4263 4264 4265 4266 | } return; } hashPtr = Tcl_CreateHashEntry(&iPtr->limit.callbacks, &key, &isNew); if (!isNew) { | | | > | 4275 4276 4277 4278 4279 4280 4281 4282 4283 4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 | } return; } hashPtr = Tcl_CreateHashEntry(&iPtr->limit.callbacks, &key, &isNew); if (!isNew) { limitCBPtr = (ScriptLimitCallback *) Tcl_GetHashValue(hashPtr); limitCBPtr->entryPtr = NULL; Tcl_LimitRemoveHandler(targetInterp, type, CallScriptLimitCallback, limitCBPtr); } limitCBPtr = (ScriptLimitCallback *) Tcl_Alloc(sizeof(ScriptLimitCallback)); limitCBPtr->interp = interp; limitCBPtr->scriptObj = scriptObj; limitCBPtr->entryPtr = hashPtr; limitCBPtr->type = type; Tcl_IncrRefCount(scriptObj); Tcl_LimitAddHandler(targetInterp, type, CallScriptLimitCallback, |
︙ | ︙ | |||
4351 4352 4353 4354 4355 4356 4357 | iPtr->limit.cmdHandlers = NULL; iPtr->limit.cmdGranularity = 1; memset(&iPtr->limit.time, 0, sizeof(Tcl_Time)); iPtr->limit.timeHandlers = NULL; iPtr->limit.timeEvent = NULL; iPtr->limit.timeGranularity = 10; Tcl_InitHashTable(&iPtr->limit.callbacks, | | | 4367 4368 4369 4370 4371 4372 4373 4374 4375 4376 4377 4378 4379 4380 4381 | iPtr->limit.cmdHandlers = NULL; iPtr->limit.cmdGranularity = 1; memset(&iPtr->limit.time, 0, sizeof(Tcl_Time)); iPtr->limit.timeHandlers = NULL; iPtr->limit.timeEvent = NULL; iPtr->limit.timeGranularity = 10; Tcl_InitHashTable(&iPtr->limit.callbacks, sizeof(ScriptLimitCallbackKey) / sizeof(int)); } /* *---------------------------------------------------------------------- * * InheritLimitsFromParent -- * |
︙ | ︙ | |||
4417 4418 4419 4420 4421 4422 4423 | *---------------------------------------------------------------------- */ static int ChildCommandLimitCmd( Tcl_Interp *interp, /* Current interpreter. */ Tcl_Interp *childInterp, /* Interpreter being adjusted. */ | | | | 4433 4434 4435 4436 4437 4438 4439 4440 4441 4442 4443 4444 4445 4446 4447 4448 | *---------------------------------------------------------------------- */ static int ChildCommandLimitCmd( Tcl_Interp *interp, /* Current interpreter. */ Tcl_Interp *childInterp, /* Interpreter being adjusted. */ Tcl_Size consumedObjc, /* Number of args already parsed. */ Tcl_Size objc, /* Total number of arguments. */ Tcl_Obj *const objv[]) /* Argument objects. */ { static const char *const options[] = { "-command", "-granularity", "-value", NULL }; enum Options { OPT_CMD, OPT_GRAN, OPT_VAL |
︙ | ︙ | |||
4442 4443 4444 4445 4446 4447 4448 | * the low level API enforces this with Tcl_Panic, which we want to * avoid. [Bug 3398794] */ if (interp == childInterp) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "limits on current interpreter inaccessible", -1)); | | > | | 4458 4459 4460 4461 4462 4463 4464 4465 4466 4467 4468 4469 4470 4471 4472 4473 4474 4475 4476 4477 4478 4479 4480 4481 4482 4483 4484 4485 | * the low level API enforces this with Tcl_Panic, which we want to * avoid. [Bug 3398794] */ if (interp == childInterp) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "limits on current interpreter inaccessible", -1)); Tcl_SetErrorCode(interp, "TCL", "OPERATION", "INTERP", "SELF", (char *)NULL); return TCL_ERROR; } if (objc == consumedObjc) { Tcl_Obj *dictPtr; TclNewObj(dictPtr); key.interp = childInterp; key.type = TCL_LIMIT_COMMANDS; hPtr = Tcl_FindHashEntry(&iPtr->limit.callbacks, &key); if (hPtr != NULL) { limitCBPtr = (ScriptLimitCallback *) Tcl_GetHashValue(hPtr); if (limitCBPtr != NULL && limitCBPtr->scriptObj != NULL) { TclDictPut(NULL, dictPtr, options[0], limitCBPtr->scriptObj); } else { goto putEmptyCommandInDict; } } else { Tcl_Obj *empty; |
︙ | ︙ | |||
4492 4493 4494 4495 4496 4497 4498 | } switch (index) { case OPT_CMD: key.interp = childInterp; key.type = TCL_LIMIT_COMMANDS; hPtr = Tcl_FindHashEntry(&iPtr->limit.callbacks, &key); if (hPtr != NULL) { | | | 4509 4510 4511 4512 4513 4514 4515 4516 4517 4518 4519 4520 4521 4522 4523 | } switch (index) { case OPT_CMD: key.interp = childInterp; key.type = TCL_LIMIT_COMMANDS; hPtr = Tcl_FindHashEntry(&iPtr->limit.callbacks, &key); if (hPtr != NULL) { limitCBPtr = (ScriptLimitCallback *) Tcl_GetHashValue(hPtr); if (limitCBPtr != NULL && limitCBPtr->scriptObj != NULL) { Tcl_SetObjResult(interp, limitCBPtr->scriptObj); } } break; case OPT_GRAN: Tcl_SetObjResult(interp, Tcl_NewWideIntObj( |
︙ | ︙ | |||
4598 4599 4600 4601 4602 4603 4604 | * Depends on the arguments. * *---------------------------------------------------------------------- */ static int ChildTimeLimitCmd( | | | | | | | 4615 4616 4617 4618 4619 4620 4621 4622 4623 4624 4625 4626 4627 4628 4629 4630 4631 4632 4633 | * Depends on the arguments. * *---------------------------------------------------------------------- */ static int ChildTimeLimitCmd( Tcl_Interp *interp, /* Current interpreter. */ Tcl_Interp *childInterp, /* Interpreter being adjusted. */ Tcl_Size consumedObjc, /* Number of args already parsed. */ Tcl_Size objc, /* Total number of arguments. */ Tcl_Obj *const objv[]) /* Argument objects. */ { static const char *const options[] = { "-command", "-granularity", "-milliseconds", "-seconds", NULL }; enum Options { OPT_CMD, OPT_GRAN, OPT_MILLI, OPT_SEC } index; |
︙ | ︙ | |||
4625 4626 4627 4628 4629 4630 4631 | * the low level API enforces this with Tcl_Panic, which we want to * avoid. [Bug 3398794] */ if (interp == childInterp) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "limits on current interpreter inaccessible", -1)); | | > | | 4642 4643 4644 4645 4646 4647 4648 4649 4650 4651 4652 4653 4654 4655 4656 4657 4658 4659 4660 4661 4662 4663 4664 4665 4666 4667 4668 4669 | * the low level API enforces this with Tcl_Panic, which we want to * avoid. [Bug 3398794] */ if (interp == childInterp) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "limits on current interpreter inaccessible", -1)); Tcl_SetErrorCode(interp, "TCL", "OPERATION", "INTERP", "SELF", (char *)NULL); return TCL_ERROR; } if (objc == consumedObjc) { Tcl_Obj *dictPtr; TclNewObj(dictPtr); key.interp = childInterp; key.type = TCL_LIMIT_TIME; hPtr = Tcl_FindHashEntry(&iPtr->limit.callbacks, &key); if (hPtr != NULL) { limitCBPtr = (ScriptLimitCallback *) Tcl_GetHashValue(hPtr); if (limitCBPtr != NULL && limitCBPtr->scriptObj != NULL) { TclDictPut(NULL, dictPtr, options[0], limitCBPtr->scriptObj); } else { goto putEmptyCommandInDict; } } else { Tcl_Obj *empty; |
︙ | ︙ | |||
4680 4681 4682 4683 4684 4685 4686 | } switch (index) { case OPT_CMD: key.interp = childInterp; key.type = TCL_LIMIT_TIME; hPtr = Tcl_FindHashEntry(&iPtr->limit.callbacks, &key); if (hPtr != NULL) { | | | 4698 4699 4700 4701 4702 4703 4704 4705 4706 4707 4708 4709 4710 4711 4712 | } switch (index) { case OPT_CMD: key.interp = childInterp; key.type = TCL_LIMIT_TIME; hPtr = Tcl_FindHashEntry(&iPtr->limit.callbacks, &key); if (hPtr != NULL) { limitCBPtr = (ScriptLimitCallback *) Tcl_GetHashValue(hPtr); if (limitCBPtr != NULL && limitCBPtr->scriptObj != NULL) { Tcl_SetObjResult(interp, limitCBPtr->scriptObj); } } break; case OPT_GRAN: Tcl_SetObjResult(interp, Tcl_NewWideIntObj( |
︙ | ︙ | |||
4778 4779 4780 4781 4782 4783 4784 | if (tmp < 0) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "seconds must be non-negative", -1)); Tcl_SetErrorCode(interp, "TCL", "OPERATION", "INTERP", "BADVALUE", (char *)NULL); return TCL_ERROR; } | | | 4796 4797 4798 4799 4800 4801 4802 4803 4804 4805 4806 4807 4808 4809 4810 | if (tmp < 0) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "seconds must be non-negative", -1)); Tcl_SetErrorCode(interp, "TCL", "OPERATION", "INTERP", "BADVALUE", (char *)NULL); return TCL_ERROR; } limitMoment.sec = (long long) tmp; break; } } if (milliObj != NULL || secObj != NULL) { if (milliObj != NULL) { /* * Setting -milliseconds but clearing -seconds, or resetting |
︙ | ︙ |
Changes to generic/tclLink.c.
︙ | ︙ | |||
111 112 113 114 115 116 117 | static const Tcl_ObjType invalidRealType = { "invalidReal", /* name */ NULL, /* freeIntRepProc */ NULL, /* dupIntRepProc */ NULL, /* updateStringProc */ NULL, /* setFromAnyProc */ | | | 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 | static const Tcl_ObjType invalidRealType = { "invalidReal", /* name */ NULL, /* freeIntRepProc */ NULL, /* dupIntRepProc */ NULL, /* updateStringProc */ NULL, /* setFromAnyProc */ TCL_OBJTYPE_V1(TclLengthOne) }; /* * Convenience macro for accessing the value of the C variable pointed to by a * link. Note that this macro produces something that may be regarded as an * lvalue or rvalue; it may be assigned to as well as read. Also note that * this macro assumes the name of the variable being accessed (linkPtr); this |
︙ | ︙ |
Changes to generic/tclListObj.c.
︙ | ︙ | |||
1612 1613 1614 1615 1616 1617 1618 | /* *---------------------------------------------------------------------- * * TclListObjGetElement -- * * Returns a single element from the array of the elements in a list | | | | 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 | /* *---------------------------------------------------------------------- * * TclListObjGetElement -- * * Returns a single element from the array of the elements in a list * object, without doing any bounds checking. Caller must ensure * that ObjPtr of type 'tclListType' and that index is valid for the * list. * *---------------------------------------------------------------------- */ Tcl_Obj * TclListObjGetElement( |
︙ | ︙ | |||
1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 | if (TclListObjGetRep(interp, toObj, &listRep) != TCL_OK) { /* Cannot be converted to a list */ return TCL_ERROR; } if (elemCount <= 0) { /* Nothing to do. Note AFTER check for list above */ return TCL_OK; } ListRepElements(&listRep, toLen, toObjv); if (elemCount > LIST_MAX || toLen > (LIST_MAX - elemCount)) { return ListLimitExceededError(interp); | > > > > > > > > > > | 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 | if (TclListObjGetRep(interp, toObj, &listRep) != TCL_OK) { /* Cannot be converted to a list */ return TCL_ERROR; } if (elemCount <= 0) { /* * Note that when elemCount <= 0, this routine is logically a * no-op, removing and adding no elements to the list. However, by removing * the string representation, we get the important side effect that the * resulting listPtr is a list in canonical form. This is important. * Resist any temptation to optimize this case further. See bug [e38dce74e2]. */ if (!ListObjIsCanonical(toObj)) { TclInvalidateStringRep(toObj); } /* Nothing to do. Note AFTER check for list above */ return TCL_OK; } ListRepElements(&listRep, toLen, toObjv); if (elemCount > LIST_MAX || toLen > (LIST_MAX - elemCount)) { return ListLimitExceededError(interp); |
︙ | ︙ |
Changes to generic/tclLoad.c.
︙ | ︙ | |||
351 352 353 354 355 356 357 | || Tcl_UniCharIsDigit(UCHAR(ch))) { break; } } if (p == pkgGuess) { Tcl_DecrRefCount(splitPtr); Tcl_SetObjResult(interp, Tcl_ObjPrintf( | | | 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 | || Tcl_UniCharIsDigit(UCHAR(ch))) { break; } } if (p == pkgGuess) { Tcl_DecrRefCount(splitPtr); Tcl_SetObjResult(interp, Tcl_ObjPrintf( "cannot figure out prefix for %s", fullFileName)); Tcl_SetErrorCode(interp, "TCL", "OPERATION", "LOAD", "WHATLIBRARY", (char *)NULL); code = TCL_ERROR; goto done; } Tcl_DStringAppend(&pfx, pkgGuess, p - pkgGuess); |
︙ | ︙ | |||
448 449 450 451 452 453 454 | * Invoke the library's initialization function (either the normal one or * the safe one, depending on whether or not the interpreter is safe). */ if (Tcl_IsSafe(target)) { if (libraryPtr->safeInitProc == NULL) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( | | | | 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 | * Invoke the library's initialization function (either the normal one or * the safe one, depending on whether or not the interpreter is safe). */ if (Tcl_IsSafe(target)) { if (libraryPtr->safeInitProc == NULL) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "cannot use library in a safe interpreter: no" " %s_SafeInit procedure", libraryPtr->prefix)); Tcl_SetErrorCode(interp, "TCL", "OPERATION", "LOAD", "UNSAFE", (char *)NULL); code = TCL_ERROR; goto done; } code = libraryPtr->safeInitProc(target); } else { if (libraryPtr->initProc == NULL) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "cannot attach library to interpreter: no %s_Init procedure", libraryPtr->prefix)); Tcl_SetErrorCode(interp, "TCL", "OPERATION", "LOAD", "ENTRYPOINT", (char *)NULL); code = TCL_ERROR; goto done; } code = libraryPtr->initProc(target); |
︙ | ︙ | |||
531 532 533 534 535 536 537 | } /* *---------------------------------------------------------------------- * * Tcl_UnloadObjCmd -- * | | | 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 | } /* *---------------------------------------------------------------------- * * Tcl_UnloadObjCmd -- * * Implements the "unload" Tcl command. See the * user documentation for details on what it does. * * Results: * A standard Tcl result. * * Side effects: * See the user documentation. |
︙ | ︙ | |||
856 857 858 859 860 861 862 | goto done; } /* * Remove this library from the interpreter's library cache. */ | > | > | | | | | | | | | | | | | | | > > | 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 | goto done; } /* * Remove this library from the interpreter's library cache. */ if (!interpExiting) { ipFirstPtr = (InterpLibrary *)Tcl_GetAssocData(target, "tclLoad", NULL); if (ipFirstPtr) { ipPtr = ipFirstPtr; if (ipPtr->libraryPtr == libraryPtr) { ipFirstPtr = ipFirstPtr->nextPtr; } else { InterpLibrary *ipPrevPtr; for (ipPrevPtr = ipPtr; ipPtr != NULL; ipPrevPtr = ipPtr, ipPtr = ipPtr->nextPtr) { if (ipPtr->libraryPtr == libraryPtr) { ipPrevPtr->nextPtr = ipPtr->nextPtr; break; } } } Tcl_Free(ipPtr); Tcl_SetAssocData(target, "tclLoad", LoadCleanupProc, ipFirstPtr); } } if (IsStatic(libraryPtr)) { goto done; } /* * The unload function was called succesfully. |
︙ | ︙ | |||
1181 1182 1183 1184 1185 1186 1187 | * Storage for all of the InterpLibrary functions for interp get deleted. * *---------------------------------------------------------------------- */ static void LoadCleanupProc( | | | | < < < < | > > > > > | 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 | * Storage for all of the InterpLibrary functions for interp get deleted. * *---------------------------------------------------------------------- */ static void LoadCleanupProc( void *clientData, /* Pointer to first InterpLibrary structure * for interp. */ Tcl_Interp *interp) { InterpLibrary *ipPtr = (InterpLibrary *)clientData, *nextPtr; LoadedLibrary *libraryPtr; while (ipPtr) { libraryPtr = ipPtr->libraryPtr; UnloadLibrary(interp, interp, libraryPtr, 0, "", 1); /* UnloadLibrary doesn't free it by interp delete, so do it here and * repeat for next. */ nextPtr = ipPtr->nextPtr; Tcl_Free(ipPtr); ipPtr = nextPtr; } } /* *---------------------------------------------------------------------- * * TclFinalizeLoad -- |
︙ | ︙ |
Changes to generic/tclNamesp.c.
︙ | ︙ | |||
72 73 74 75 76 77 78 | */ static void DeleteImportedCmd(void *clientData); static int DoImport(Tcl_Interp *interp, Namespace *nsPtr, Tcl_HashEntry *hPtr, const char *cmdName, const char *pattern, Namespace *importNsPtr, int allowOverwrite); | | > | | | > | 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | */ static void DeleteImportedCmd(void *clientData); static int DoImport(Tcl_Interp *interp, Namespace *nsPtr, Tcl_HashEntry *hPtr, const char *cmdName, const char *pattern, Namespace *importNsPtr, int allowOverwrite); static void DupNsNameInternalRep(Tcl_Obj *objPtr, Tcl_Obj *copyPtr); static char * ErrorCodeRead(void *clientData, Tcl_Interp *interp, const char *name1, const char *name2, int flags); static char * ErrorInfoRead(void *clientData, Tcl_Interp *interp, const char *name1, const char *name2, int flags); static char * EstablishErrorCodeTraces(void *clientData, Tcl_Interp *interp, const char *name1, const char *name2, int flags); static char * EstablishErrorInfoTraces(void *clientData, Tcl_Interp *interp, const char *name1, const char *name2, int flags); static void FreeNsNameInternalRep(Tcl_Obj *objPtr); static int GetNamespaceFromObj(Tcl_Interp *interp, Tcl_Obj *objPtr, Tcl_Namespace **nsPtrPtr); static int InvokeImportedNRCmd(void *clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); static Tcl_ObjCmdProc NamespaceChildrenCmd; static Tcl_ObjCmdProc NamespaceCodeCmd; static Tcl_ObjCmdProc NamespaceCurrentCmd; static Tcl_ObjCmdProc NamespaceDeleteCmd; static Tcl_ObjCmdProc NamespaceEvalCmd; static Tcl_ObjCmdProc NRNamespaceEvalCmd; static Tcl_ObjCmdProc NamespaceExistsCmd; |
︙ | ︙ | |||
130 131 132 133 134 135 136 | FreeNsNameInternalRep, /* freeIntRepProc */ DupNsNameInternalRep, /* dupIntRepProc */ NULL, /* updateStringProc */ SetNsNameFromAny, /* setFromAnyProc */ TCL_OBJTYPE_V0 }; | | | | | | | | 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 | FreeNsNameInternalRep, /* freeIntRepProc */ DupNsNameInternalRep, /* dupIntRepProc */ NULL, /* updateStringProc */ SetNsNameFromAny, /* setFromAnyProc */ TCL_OBJTYPE_V0 }; #define NsNameSetInternalRep(objPtr, nnPtr) \ do { \ Tcl_ObjInternalRep ir; \ (nnPtr)->refCount++; \ ir.twoPtrValue.ptr1 = (nnPtr); \ ir.twoPtrValue.ptr2 = NULL; \ Tcl_StoreInternalRep((objPtr), &nsNameType, &ir); \ } while (0) #define NsNameGetInternalRep(objPtr, nnPtr) \ do { \ const Tcl_ObjInternalRep *irPtr; \ irPtr = TclFetchInternalRep((objPtr), &nsNameType); \ (nnPtr) = irPtr ? (ResolvedNsName *) irPtr->twoPtrValue.ptr1 : NULL; \ } while (0) /* * Array of values describing how to implement each standard subcommand of the * "namespace" command. */ |
︙ | ︙ | |||
173 174 175 176 177 178 179 180 181 182 183 184 185 186 | {"qualifiers", NamespaceQualifiersCmd, TclCompileNamespaceQualifiersCmd, NULL, NULL, 0}, {"tail", NamespaceTailCmd, TclCompileNamespaceTailCmd, NULL, NULL, 0}, {"unknown", NamespaceUnknownCmd, TclCompileBasic0Or1ArgCmd, NULL, NULL, 0}, {"upvar", NamespaceUpvarCmd, TclCompileNamespaceUpvarCmd, NULL, NULL, 0}, {"which", NamespaceWhichCmd, TclCompileNamespaceWhichCmd, NULL, NULL, 0}, {NULL, NULL, NULL, NULL, NULL, 0} }; /* *---------------------------------------------------------------------- * * TclInitNamespaceSubsystem -- * * This function is called to initialize all the structures that are used | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 | {"qualifiers", NamespaceQualifiersCmd, TclCompileNamespaceQualifiersCmd, NULL, NULL, 0}, {"tail", NamespaceTailCmd, TclCompileNamespaceTailCmd, NULL, NULL, 0}, {"unknown", NamespaceUnknownCmd, TclCompileBasic0Or1ArgCmd, NULL, NULL, 0}, {"upvar", NamespaceUpvarCmd, TclCompileNamespaceUpvarCmd, NULL, NULL, 0}, {"which", NamespaceWhichCmd, TclCompileNamespaceWhichCmd, NULL, NULL, 0}, {NULL, NULL, NULL, NULL, NULL, 0} }; /* *---------------------------------------------------------------------- * * CreateChildEntry -- * * Create a child namespace hash table entry. * * Results: * Handle to hash table entry for a child namespace with the given name. * Caller should handle filling in the namespace value. * * Side effects: * None. * *---------------------------------------------------------------------- */ static inline Tcl_HashEntry * CreateChildEntry( Namespace *nsPtr, /* Parent namespace. */ const char *name, /* Simple name to look for. */ int *isNewPtr) /* Pointer to var with whether this is new. */ { #ifndef BREAK_NAMESPACE_COMPAT return Tcl_CreateHashEntry(&nsPtr->childTable, name, isNewPtr); #else if )nsPtr->childTablePtr == NULL) { nsPtr->childTablePtr = (Tcl_HashTable *) Tcl_Alloc(sizeof(Tcl_HashTable)); Tcl_InitHashTable(nsPtr->childTablePtr, TCL_STRING_KEYS); } return Tcl_CreateHashEntry(nsPtr->childTablePtr, name, isNewPtr); #endif } /* *---------------------------------------------------------------------- * * FindChildEntry -- * * Look up a child namespace hash table entry. * * Results: * Handle to hash table entry if a child namespace with the given name * exists, otherwise NULL. * * Side effects: * None. * *---------------------------------------------------------------------- */ static inline Tcl_HashEntry * FindChildEntry( Namespace *nsPtr, /* Parent namespace. */ const char *name) /* Simple name to look for. */ { #ifndef BREAK_NAMESPACE_COMPAT return Tcl_FindHashEntry(&nsPtr->childTable, name); #else return nsPtr->childTablePtr ? Tcl_FindHashEntry(nsPtr->childTablePtr, name) : NULL; #endif } /* *---------------------------------------------------------------------- * * FirstChildEntry -- * * Start an iteration through the collection of child namespaces. * * Results: * Handle to hash table entry if a child namespace exists, otherwise NULL. * * Side effects: * Updates the search handle. * *---------------------------------------------------------------------- */ static inline Tcl_HashEntry * FirstChildEntry( Namespace *nsPtr, /* Parent namespace. */ Tcl_HashSearch *searchPtr) /* Iteration handle reference. */ { #ifndef BREAK_NAMESPACE_COMPAT return Tcl_FirstHashEntry(&nsPtr->childTable, searchPtr); #else return nsPtr->childTablePtr ? Tcl_FirstHashEntry(nsPtr->childTablePtr, searchPtr) : NULL; #endif } /* *---------------------------------------------------------------------- * * NumChildEntries -- * * Get the count of child namespaces. * * Results: * Number of child entries. * * Side effects: * None. * *---------------------------------------------------------------------- */ static inline Tcl_Size NumChildEntries( Namespace *nsPtr) { #ifndef BREAK_NAMESPACE_COMPAT return nsPtr->childTable.numEntries; #else return nsPtr->childTablePtr ? nsPtr->childTablePtr->numEntries : 0; #endif } /* *---------------------------------------------------------------------- * * TclInitNamespaceSubsystem -- * * This function is called to initialize all the structures that are used |
︙ | ︙ | |||
217 218 219 220 221 222 223 | * None. * *---------------------------------------------------------------------- */ Tcl_Namespace * Tcl_GetCurrentNamespace( | | | 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 | * None. * *---------------------------------------------------------------------- */ Tcl_Namespace * Tcl_GetCurrentNamespace( Tcl_Interp *interp) /* Interpreter whose current namespace is * being queried. */ { return TclGetCurrentNamespace(interp); } /* *---------------------------------------------------------------------- |
︙ | ︙ | |||
241 242 243 244 245 246 247 | * None. * *---------------------------------------------------------------------- */ Tcl_Namespace * Tcl_GetGlobalNamespace( | | | 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 | * None. * *---------------------------------------------------------------------- */ Tcl_Namespace * Tcl_GetGlobalNamespace( Tcl_Interp *interp) /* Interpreter whose global namespace should * be returned. */ { return TclGetGlobalNamespace(interp); } /* *---------------------------------------------------------------------- |
︙ | ︙ | |||
457 458 459 460 461 462 463 | * If new variables are created, they will be * created in the frame. If 0, the frame is * for a "namespace eval" or "namespace * inscope" command and var references are * treated as references to namespace * variables. */ { | | | 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 | * If new variables are created, they will be * created in the frame. If 0, the frame is * for a "namespace eval" or "namespace * inscope" command and var references are * treated as references to namespace * variables. */ { *framePtrPtr = (Tcl_CallFrame *) TclStackAlloc(interp, sizeof(CallFrame)); return Tcl_PushCallFrame(interp, *framePtrPtr, namespacePtr, isProcCallFrame); } void TclPopStackFrame( Tcl_Interp *interp) /* Interpreter with call frame to pop. */ |
︙ | ︙ | |||
649 650 651 652 653 654 655 | Tcl_CreateNamespace( Tcl_Interp *interp, /* Interpreter in which a new namespace is * being created. Also used for error * reporting. */ const char *name, /* Name for the new namespace. May be a * qualified name with names of ancestor * namespaces separated by "::"s. */ | | | 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 | Tcl_CreateNamespace( Tcl_Interp *interp, /* Interpreter in which a new namespace is * being created. Also used for error * reporting. */ const char *name, /* Name for the new namespace. May be a * qualified name with names of ancestor * namespaces separated by "::"s. */ void *clientData, /* One-word value to store with namespace. */ Tcl_NamespaceDeleteProc *deleteProc) /* Function called to delete client data when * the namespace is deleted. NULL if no * function should be called. */ { Interp *iPtr = (Interp *) interp; Namespace *nsPtr, *ancestorPtr; |
︙ | ︙ | |||
741 742 743 744 745 746 747 | } /* * Check for a bad namespace name and make sure that the name does not * already exist in the parent namespace. */ | < < < < < | < < | | | 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 | } /* * Check for a bad namespace name and make sure that the name does not * already exist in the parent namespace. */ if (FindChildEntry(parentPtr, simpleName) != NULL) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "can't create namespace \"%s\": already exists", name)); Tcl_SetErrorCode(interp, "TCL", "OPERATION", "NAMESPACE", "CREATEEXISTING", (char *)NULL); Tcl_DStringFree(&tmpBuffer); return NULL; } /* * Create the new namespace and root it in its parent. Increment the count * of namespaces created. */ doCreate: nsPtr = (Namespace *) Tcl_Alloc(sizeof(Namespace)); nameLen = strlen(simpleName) + 1; nsPtr->name = (char *) Tcl_Alloc(nameLen); memcpy(nsPtr->name, simpleName, nameLen); nsPtr->fullName = NULL; /* Set below. */ nsPtr->clientData = clientData; nsPtr->deleteProc = deleteProc; nsPtr->parentPtr = parentPtr; #ifndef BREAK_NAMESPACE_COMPAT Tcl_InitHashTable(&nsPtr->childTable, TCL_STRING_KEYS); |
︙ | ︙ | |||
800 801 802 803 804 805 806 | nsPtr->unknownHandlerPtr = NULL; nsPtr->commandPathLength = 0; nsPtr->commandPathArray = NULL; nsPtr->commandPathSourceList = NULL; nsPtr->earlyDeleteProc = NULL; if (parentPtr != NULL) { | < < | | 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 | nsPtr->unknownHandlerPtr = NULL; nsPtr->commandPathLength = 0; nsPtr->commandPathArray = NULL; nsPtr->commandPathSourceList = NULL; nsPtr->earlyDeleteProc = NULL; if (parentPtr != NULL) { entryPtr = CreateChildEntry(parentPtr, simpleName, &newEntry); Tcl_SetHashValue(entryPtr, nsPtr); } else { /* * In the global namespace create traces to maintain the ::errorInfo * and ::errorCode variables. */ |
︙ | ︙ | |||
853 854 855 856 857 858 859 | namePtr = buffPtr; buffPtr = tempPtr; } } name = Tcl_DStringValue(namePtr); nameLen = Tcl_DStringLength(namePtr); | | | 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 | namePtr = buffPtr; buffPtr = tempPtr; } } name = Tcl_DStringValue(namePtr); nameLen = Tcl_DStringLength(namePtr); nsPtr->fullName = (char *) Tcl_Alloc(nameLen + 1); memcpy(nsPtr->fullName, name, nameLen + 1); Tcl_DStringFree(&buffer1); Tcl_DStringFree(&buffer2); Tcl_DStringFree(&tmpBuffer); /* |
︙ | ︙ | |||
901 902 903 904 905 906 907 | */ void Tcl_DeleteNamespace( Tcl_Namespace *namespacePtr)/* Points to the namespace to delete. */ { Namespace *nsPtr = (Namespace *) namespacePtr; | | | < | 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 | */ void Tcl_DeleteNamespace( Tcl_Namespace *namespacePtr)/* Points to the namespace to delete. */ { Namespace *nsPtr = (Namespace *) namespacePtr; Tcl_Interp *interp = nsPtr->interp; Namespace *globalNsPtr = (Namespace *) TclGetGlobalNamespace(interp); Tcl_HashEntry *entryPtr; Tcl_HashSearch search; Command *cmdPtr; /* * Ensure that this namespace doesn't get deallocated in the meantime. */ |
︙ | ︙ | |||
945 946 947 948 949 950 951 | * * NOTE: we could avoid traversing the ns's command list by keeping a * separate list of coros. */ for (entryPtr = Tcl_FirstHashEntry(&nsPtr->cmdTable, &search); entryPtr != NULL;) { | | | < | 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 | * * NOTE: we could avoid traversing the ns's command list by keeping a * separate list of coros. */ for (entryPtr = Tcl_FirstHashEntry(&nsPtr->cmdTable, &search); entryPtr != NULL;) { cmdPtr = (Command *) Tcl_GetHashValue(entryPtr); if (cmdPtr->nreProc == TclNRInterpCoroutine) { Tcl_DeleteCommandFromToken(interp, (Tcl_Command) cmdPtr); entryPtr = Tcl_FirstHashEntry(&nsPtr->cmdTable, &search); } else { entryPtr = Tcl_NextHashEntry(&search); } } /* |
︙ | ︙ | |||
985 986 987 988 989 990 991 | if (nsPtr->unknownHandlerPtr != NULL) { Tcl_DecrRefCount(nsPtr->unknownHandlerPtr); nsPtr->unknownHandlerPtr = NULL; } /* | | | | | | | | | | | | | | | | < < | | | | 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 | if (nsPtr->unknownHandlerPtr != NULL) { Tcl_DecrRefCount(nsPtr->unknownHandlerPtr); nsPtr->unknownHandlerPtr = NULL; } /* * If the namespace is on the call frame stack, it is marked as "dying" * (NS_DYING is OR'd into its flags): Contents of the namespace are * still available and visible until the namespace is later marked as * NS_DEAD, and its commands and variables are still usable by any * active call frames referring to th namespace. When all active call * frames referring to the namespace have been popped from the Tcl * stack, Tcl_PopCallFrame calls Tcl_DeleteNamespace again. If no * nsName objects refer to the namespace (i.e., if its refCount is * zero), its commands and variables are deleted and the storage for * its namespace structure is freed. Otherwise, if its refCount is * nonzero, the namespace's commands and variables are deleted but the * structure isn't freed. Instead, NS_DEAD is OR'd into the structure's * flags to allow the namespace resolution code to recognize that the * namespace is "deleted". The structure's storage is freed by * FreeNsNameInternalRep when its refCount reaches 0. */ if (nsPtr->activationCount > (nsPtr == globalNsPtr)) { nsPtr->flags |= NS_DYING; if (nsPtr->parentPtr != NULL) { entryPtr = FindChildEntry(nsPtr->parentPtr, nsPtr->name); if (entryPtr != NULL) { Tcl_DeleteHashEntry(entryPtr); } } nsPtr->parentPtr = NULL; } else if (!(nsPtr->flags & NS_TEARDOWN)) { /* * Delete the namespace and everything in it. If this is the global * namespace, then clear it but don't free its storage unless the * interpreter is being torn down. Set the NS_TEARDOWN flag to avoid * recursive calls here - if the namespace is really in the process of * being deleted, ignore any second call. */ nsPtr->flags |= NS_DYING | NS_TEARDOWN; TclTeardownNamespace(nsPtr); if ((nsPtr != globalNsPtr) || (((Interp *) interp)->flags & DELETED)) { /* * If this is the global namespace, then it may have residual * "errorInfo" and "errorCode" variables for errors that occurred * while it was being torn down. Try to clear the variable list * one last time. */ |
︙ | ︙ | |||
1077 1078 1079 1080 1081 1082 1083 | return (nsPtr->flags & NS_DYING) ? 1 : 0; } void TclDeleteNamespaceChildren( Namespace *nsPtr) /* Namespace whose children to delete */ { | | > | < | | | | | | | | < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 | return (nsPtr->flags & NS_DYING) ? 1 : 0; } void TclDeleteNamespaceChildren( Namespace *nsPtr) /* Namespace whose children to delete */ { Tcl_Interp *interp = nsPtr->interp; Tcl_HashEntry *entryPtr; size_t i; int unchecked; Tcl_HashSearch search; /* * Delete all the child namespaces. * * BE CAREFUL: When each child is deleted, it divorces itself from its * parent. The hash table can't be properly traversed if its elements are * being deleted. Because of traces (and the desire to avoid the * quadratic problems of just using Tcl_FirstHashEntry over and over, [Bug * f97d4ee020]) copy to a temporary array and then delete all those * namespaces. * * Important: leave the hash table itself still live. */ unchecked = (NumChildEntries(nsPtr) > 0); while (NumChildEntries(nsPtr) > 0 && unchecked) { size_t length = NumChildEntries(nsPtr); Namespace **children = (Namespace **) TclStackAlloc(interp, sizeof(Namespace *) * length); i = 0; for (entryPtr = FirstChildEntry(nsPtr, &search); entryPtr != NULL; entryPtr = Tcl_NextHashEntry(&search)) { children[i] = (Namespace *) Tcl_GetHashValue(entryPtr); children[i]->refCount++; i++; } unchecked = 0; for (i = 0 ; i < length ; i++) { if (!(children[i]->flags & NS_DYING)) { unchecked = 1; Tcl_DeleteNamespace((Tcl_Namespace *) children[i]); TclNsDecrRefCount(children[i]); } } TclStackFree(interp, children); } } /* *---------------------------------------------------------------------- * * TclTeardownNamespace -- * |
︙ | ︙ | |||
1174 1175 1176 1177 1178 1179 1180 | * Deletes all commands, variables and namespaces in this namespace. * *---------------------------------------------------------------------- */ void TclTeardownNamespace( | | | | 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 | * Deletes all commands, variables and namespaces in this namespace. * *---------------------------------------------------------------------- */ void TclTeardownNamespace( Namespace *nsPtr) /* Points to the namespace to be dismantled * and unlinked from its parent. */ { Tcl_Interp *interp = nsPtr->interp; Tcl_HashEntry *entryPtr; Tcl_HashSearch search; Tcl_Size i; /* * Start by destroying the namespace's variable table, since variables * might trigger traces. Variable table should be cleared but not freed! |
︙ | ︙ | |||
1202 1203 1204 1205 1206 1207 1208 | * problems of just using Tcl_FirstHashEntry over and over, [Bug * f97d4ee020]) we copy to a temporary array and then delete all those * commands. */ while (nsPtr->cmdTable.numEntries > 0) { Tcl_Size length = nsPtr->cmdTable.numEntries; | | | | | < | < < | | 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 | * problems of just using Tcl_FirstHashEntry over and over, [Bug * f97d4ee020]) we copy to a temporary array and then delete all those * commands. */ while (nsPtr->cmdTable.numEntries > 0) { Tcl_Size length = nsPtr->cmdTable.numEntries; Command **cmds = (Command **) TclStackAlloc(interp, sizeof(Command *) * length); i = 0; for (entryPtr = Tcl_FirstHashEntry(&nsPtr->cmdTable, &search); entryPtr != NULL; entryPtr = Tcl_NextHashEntry(&search)) { cmds[i] = (Command *) Tcl_GetHashValue(entryPtr); cmds[i]->refCount++; i++; } for (i = 0 ; i < length ; i++) { Tcl_DeleteCommandFromToken(interp, (Tcl_Command) cmds[i]); TclCleanupCommandMacro(cmds[i]); } TclStackFree(interp, cmds); } Tcl_DeleteHashTable(&nsPtr->cmdTable); Tcl_InitHashTable(&nsPtr->cmdTable, TCL_STRING_KEYS); /* * Remove the namespace from its parent's child hashtable. */ if (nsPtr->parentPtr != NULL) { entryPtr = FindChildEntry(nsPtr->parentPtr, nsPtr->name); if (entryPtr != NULL) { Tcl_DeleteHashEntry(entryPtr); } } nsPtr->parentPtr = NULL; /* |
︙ | ︙ | |||
1312 1313 1314 1315 1316 1317 1318 | * None. * *---------------------------------------------------------------------- */ static void NamespaceFree( | | | 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 | * None. * *---------------------------------------------------------------------- */ static void NamespaceFree( Namespace *nsPtr) /* Points to the namespace to free. */ { /* * Most of the namespace's contents are freed when the namespace is * deleted by Tcl_DeleteNamespace. All that remains is to free its names * (for error messages), and the structure itself. */ |
︙ | ︙ | |||
1460 1461 1462 1463 1464 1465 1466 | * pattern. */ neededElems = nsPtr->numExportPatterns + 1; if (neededElems > nsPtr->maxExportPatterns) { nsPtr->maxExportPatterns = nsPtr->maxExportPatterns ? 2 * nsPtr->maxExportPatterns : INIT_EXPORT_PATTERNS; | | | | 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 | * pattern. */ neededElems = nsPtr->numExportPatterns + 1; if (neededElems > nsPtr->maxExportPatterns) { nsPtr->maxExportPatterns = nsPtr->maxExportPatterns ? 2 * nsPtr->maxExportPatterns : INIT_EXPORT_PATTERNS; nsPtr->exportArrayPtr = (char **) Tcl_Realloc(nsPtr->exportArrayPtr, sizeof(char *) * nsPtr->maxExportPatterns); } /* * Add the pattern to the namespace's array of export patterns. */ len = strlen(pattern); patternCpy = (char *) Tcl_Alloc(len + 1); memcpy(patternCpy, pattern, len + 1); nsPtr->exportArrayPtr[nsPtr->numExportPatterns] = patternCpy; nsPtr->numExportPatterns++; /* * The list of commands actually exported from the namespace might have |
︙ | ︙ | |||
1510 1511 1512 1513 1514 1515 1516 | * object. * *---------------------------------------------------------------------- */ int Tcl_AppendExportList( | | > | 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 | * object. * *---------------------------------------------------------------------- */ int Tcl_AppendExportList( Tcl_Interp *interp, /* Interpreter used for global NS and error * reporting. */ Tcl_Namespace *namespacePtr,/* Points to the namespace whose export * pattern list is appended onto objPtr. NULL * for the current namespace. */ Tcl_Obj *objPtr) /* Points to the Tcl object onto which the * export pattern list is appended. */ { Namespace *nsPtr; |
︙ | ︙ | |||
1611 1612 1613 1614 1615 1616 1617 | * imported commands in autoloaded libraries and loads them in. That way, * they will be found when we try to create links below. * * Note that we don't just call Tcl_EvalObjv() directly because we do not * want absence of the command to be a failure case. */ | | | 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 | * imported commands in autoloaded libraries and loads them in. That way, * they will be found when we try to create links below. * * Note that we don't just call Tcl_EvalObjv() directly because we do not * want absence of the command to be a failure case. */ if (Tcl_FindCommand(interp, "auto_import", NULL, TCL_GLOBAL_ONLY) != NULL) { Tcl_Obj *objv[2]; int result; TclNewLiteralStringObj(objv[0], "auto_import"); objv[1] = Tcl_NewStringObj(pattern, -1); Tcl_IncrRefCount(objv[0]); |
︙ | ︙ | |||
1681 1682 1683 1684 1685 1686 1687 | return TCL_OK; } return DoImport(interp, nsPtr, hPtr, simplePattern, pattern, importNsPtr, allowOverwrite); } for (hPtr = Tcl_FirstHashEntry(&importNsPtr->cmdTable, &search); (hPtr != NULL); hPtr = Tcl_NextHashEntry(&search)) { | | | 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 | return TCL_OK; } return DoImport(interp, nsPtr, hPtr, simplePattern, pattern, importNsPtr, allowOverwrite); } for (hPtr = Tcl_FirstHashEntry(&importNsPtr->cmdTable, &search); (hPtr != NULL); hPtr = Tcl_NextHashEntry(&search)) { char *cmdName = (char *) Tcl_GetHashKey(&importNsPtr->cmdTable, hPtr); if (Tcl_StringMatch(cmdName, simplePattern) && DoImport(interp, nsPtr, hPtr, cmdName, pattern, importNsPtr, allowOverwrite) == TCL_ERROR) { return TCL_ERROR; } } |
︙ | ︙ | |||
1730 1731 1732 1733 1734 1735 1736 | /* * The command cmdName in the source namespace matches the pattern. Check * whether it was exported. If it wasn't, we ignore it. */ while (!exported && (i < importNsPtr->numExportPatterns)) { | | < | 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 | /* * The command cmdName in the source namespace matches the pattern. Check * whether it was exported. If it wasn't, we ignore it. */ while (!exported && (i < importNsPtr->numExportPatterns)) { exported |= Tcl_StringMatch(cmdName, importNsPtr->exportArrayPtr[i++]); } if (!exported) { return TCL_OK; } /* * Unless there is a name clash, create an imported command in the current |
︙ | ︙ | |||
1768 1769 1770 1771 1772 1773 1774 | Tcl_DStringAppend(&ds, cmdName, -1); /* * Check whether creating the new imported command in the current * namespace would create a cycle of imported command references. */ | | | | | | | | > | 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 | Tcl_DStringAppend(&ds, cmdName, -1); /* * Check whether creating the new imported command in the current * namespace would create a cycle of imported command references. */ cmdPtr = (Command *) Tcl_GetHashValue(hPtr); if (found != NULL && cmdPtr->deleteProc == DeleteImportedCmd) { Command *overwrite = (Command *) Tcl_GetHashValue(found); Command *linkCmd = cmdPtr; while (linkCmd->deleteProc == DeleteImportedCmd) { dataPtr = (ImportedCmdData *) linkCmd->objClientData; linkCmd = dataPtr->realCmdPtr; if (overwrite == linkCmd) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "import pattern \"%s\" would create a loop" " containing command \"%s\"", pattern, Tcl_DStringValue(&ds))); Tcl_DStringFree(&ds); Tcl_SetErrorCode(interp, "TCL", "IMPORT", "LOOP", (char *)NULL); return TCL_ERROR; } } } dataPtr = (ImportedCmdData *) Tcl_Alloc(sizeof(ImportedCmdData)); importedCmd = Tcl_NRCreateCommand(interp, Tcl_DStringValue(&ds), TclInvokeImportedCmd, InvokeImportedNRCmd, dataPtr, DeleteImportedCmd); dataPtr->realCmdPtr = cmdPtr; /* corresponding decrement is in DeleteImportedCmd */ cmdPtr->refCount++; dataPtr->selfPtr = (Command *) importedCmd; dataPtr->selfPtr->compileProc = cmdPtr->compileProc; Tcl_DStringFree(&ds); /* * Create an ImportRef structure describing this new import command * and add it to the import ref list in the "real" command. */ refPtr = (ImportRef *) Tcl_Alloc(sizeof(ImportRef)); refPtr->importedCmdPtr = (Command *) importedCmd; refPtr->nextPtr = cmdPtr->importRefPtr; cmdPtr->importRefPtr = refPtr; } else { Command *overwrite = (Command *) Tcl_GetHashValue(found); if (overwrite->deleteProc == DeleteImportedCmd) { ImportedCmdData *dataPtr = (ImportedCmdData *) overwrite->objClientData; if (dataPtr->realCmdPtr == Tcl_GetHashValue(hPtr)) { /* * Repeated import of same command is acceptable. */ return TCL_OK; |
︙ | ︙ | |||
1906 1907 1908 1909 1910 1911 1912 | /* * The pattern is simple. Delete any imported commands that match it. */ if (TclMatchIsTrivial(simplePattern)) { hPtr = Tcl_FindHashEntry(&nsPtr->cmdTable, simplePattern); if (hPtr != NULL) { | | | | | | > | | 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 | /* * The pattern is simple. Delete any imported commands that match it. */ if (TclMatchIsTrivial(simplePattern)) { hPtr = Tcl_FindHashEntry(&nsPtr->cmdTable, simplePattern); if (hPtr != NULL) { Command *cmdPtr = (Command *) Tcl_GetHashValue(hPtr); if (cmdPtr && (cmdPtr->deleteProc == DeleteImportedCmd)) { Tcl_DeleteCommandFromToken(interp, (Tcl_Command) cmdPtr); } } return TCL_OK; } for (hPtr = Tcl_FirstHashEntry(&nsPtr->cmdTable, &search); (hPtr != NULL); hPtr = Tcl_NextHashEntry(&search)) { Command *cmdPtr = (Command *) Tcl_GetHashValue(hPtr); if (cmdPtr->deleteProc != DeleteImportedCmd) { continue; } cmdName = (char *) Tcl_GetHashKey(&nsPtr->cmdTable, hPtr); if (Tcl_StringMatch(cmdName, simplePattern)) { Tcl_DeleteCommandFromToken(interp, (Tcl_Command) cmdPtr); } } return TCL_OK; } /* * The pattern was namespace-qualified. */ for (hPtr = Tcl_FirstHashEntry(&nsPtr->cmdTable, &search); (hPtr != NULL); hPtr = Tcl_NextHashEntry(&search)) { Tcl_CmdInfo info; Tcl_Command token = (Tcl_Command) Tcl_GetHashValue(hPtr); Tcl_Command origin = TclGetOriginalCommand(token); if (Tcl_GetCommandInfoFromToken(origin, &info) == 0) { continue; /* Not an imported command. */ } if (info.namespacePtr != (Tcl_Namespace *) sourceNsPtr) { /* * Original not in namespace we're matching. Check the first link * in the import chain. */ Command *cmdPtr = (Command *) token; ImportedCmdData *dataPtr = (ImportedCmdData *) cmdPtr->objClientData; Tcl_Command firstToken = (Tcl_Command) dataPtr->realCmdPtr; if (firstToken == origin) { continue; } Tcl_GetCommandInfoFromToken(firstToken, &info); if (info.namespacePtr != (Tcl_Namespace *) sourceNsPtr) { continue; } origin = firstToken; } if (Tcl_StringMatch(Tcl_GetCommandName(NULL, origin), simplePattern)) { Tcl_DeleteCommandFromToken(interp, token); } } return TCL_OK; } /* |
︙ | ︙ | |||
1997 1998 1999 2000 2001 2002 2003 | Tcl_Command TclGetOriginalCommand( Tcl_Command command) /* The imported command for which the original * command should be returned. */ { Command *cmdPtr = (Command *) command; | < | | 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 | Tcl_Command TclGetOriginalCommand( Tcl_Command command) /* The imported command for which the original * command should be returned. */ { Command *cmdPtr = (Command *) command; if (cmdPtr->deleteProc != DeleteImportedCmd) { return NULL; } while (cmdPtr->deleteProc == DeleteImportedCmd) { ImportedCmdData *dataPtr = (ImportedCmdData *) cmdPtr->objClientData; cmdPtr = dataPtr->realCmdPtr; } return (Tcl_Command) cmdPtr; } /* *---------------------------------------------------------------------- |
︙ | ︙ | |||
2031 2032 2033 2034 2035 2036 2037 | * wrong, the result object is set to an error message. * *---------------------------------------------------------------------- */ static int InvokeImportedNRCmd( | | | | | 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 | * wrong, the result object is set to an error message. * *---------------------------------------------------------------------- */ static int InvokeImportedNRCmd( void *clientData, /* Points to the imported command's * ImportedCmdData structure. */ Tcl_Interp *interp, /* Current interpreter. */ int objc, /* Number of arguments. */ Tcl_Obj *const objv[]) /* The argument objects. */ { ImportedCmdData *dataPtr = (ImportedCmdData *) clientData; Command *realCmdPtr = dataPtr->realCmdPtr; TclSkipTailcall(interp); return TclNREvalObjv(interp, objc, objv, TCL_EVAL_NOERR, realCmdPtr); } int TclInvokeImportedCmd( void *clientData, /* Points to the imported command's * ImportedCmdData structure. */ Tcl_Interp *interp, /* Current interpreter. */ int objc, /* Number of arguments. */ Tcl_Obj *const objv[]) /* The argument objects. */ { return Tcl_NRCallObjProc(interp, InvokeImportedNRCmd, clientData, objc, objv); |
︙ | ︙ | |||
2079 2080 2081 2082 2083 2084 2085 | * Removes the imported command from the real command's import list. * *---------------------------------------------------------------------- */ static void DeleteImportedCmd( | | | | 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 | * Removes the imported command from the real command's import list. * *---------------------------------------------------------------------- */ static void DeleteImportedCmd( void *clientData) /* Points to the imported command's * ImportedCmdData structure. */ { ImportedCmdData *dataPtr = (ImportedCmdData *) clientData; Command *realCmdPtr = dataPtr->realCmdPtr; Command *selfPtr = dataPtr->selfPtr; ImportRef *refPtr, *prevPtr; prevPtr = NULL; for (refPtr = realCmdPtr->importRefPtr; refPtr != NULL; refPtr = refPtr->nextPtr) { |
︙ | ︙ | |||
2346 2347 2348 2349 2350 2351 2352 | * Look up the namespace qualifier nsName in the current namespace * context. If it isn't found but TCL_CREATE_NS_IF_UNKNOWN is set, * create that qualifying namespace. This is needed for functions like * Tcl_CreateObjCommand that cannot fail. */ if (nsPtr != NULL) { | < < < < | < < < < | | 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 | * Look up the namespace qualifier nsName in the current namespace * context. If it isn't found but TCL_CREATE_NS_IF_UNKNOWN is set, * create that qualifying namespace. This is needed for functions like * Tcl_CreateObjCommand that cannot fail. */ if (nsPtr != NULL) { entryPtr = FindChildEntry(nsPtr, nsName); if (entryPtr != NULL) { nsPtr = (Namespace *) Tcl_GetHashValue(entryPtr); } else if (flags & TCL_CREATE_NS_IF_UNKNOWN) { Tcl_CallFrame *framePtr; (void) TclPushStackFrame(interp, &framePtr, (Tcl_Namespace *) nsPtr, /*isProcCallFrame*/ 0); nsPtr = (Namespace *) |
︙ | ︙ | |||
2385 2386 2387 2388 2389 2390 2391 | } /* * Look up the namespace qualifier in the alternate search path too. */ if (altNsPtr != NULL) { | < < < < < < | < < | | 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 | } /* * Look up the namespace qualifier in the alternate search path too. */ if (altNsPtr != NULL) { entryPtr = FindChildEntry(altNsPtr, nsName); if (entryPtr != NULL) { altNsPtr = (Namespace *) Tcl_GetHashValue(entryPtr); } else { /* Remember last found in alternate path */ lastAltNsPtr = altNsPtr; altNsPtr = NULL; } } |
︙ | ︙ | |||
2518 2519 2520 2521 2522 2523 2524 | * (current namespace if contextNsPtr is * NULL), then in global namespace. */ Tcl_Namespace *contextNsPtr,/* Ignored if TCL_GLOBAL_ONLY flag is set or * if the name starts with "::". Otherwise, * points to namespace in which to resolve * name; if NULL, look up name in the current * namespace. */ | | | 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 | * (current namespace if contextNsPtr is * NULL), then in global namespace. */ Tcl_Namespace *contextNsPtr,/* Ignored if TCL_GLOBAL_ONLY flag is set or * if the name starts with "::". Otherwise, * points to namespace in which to resolve * name; if NULL, look up name in the current * namespace. */ int flags) /* Flags controlling namespace lookup: an OR'd * combination of TCL_GLOBAL_ONLY and * TCL_LEAVE_ERR_MSG flags. */ { Namespace *nsPtr, *dummy1Ptr, *dummy2Ptr; const char *dummy; /* |
︙ | ︙ | |||
2630 2631 2632 2633 2634 2635 2636 | result = resPtr->cmdResProc(interp, name, (Tcl_Namespace *) cxtNsPtr, flags, &cmd); } resPtr = resPtr->nextPtr; } if (result == TCL_OK) { | | | 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 | result = resPtr->cmdResProc(interp, name, (Tcl_Namespace *) cxtNsPtr, flags, &cmd); } resPtr = resPtr->nextPtr; } if (result == TCL_OK) { ((Command *) cmd)->flags |= CMD_VIA_RESOLVER; return cmd; } else if (result != TCL_CONTINUE) { return NULL; } } |
︙ | ︙ | |||
2656 2657 2658 2659 2660 2661 2662 | TCL_NAMESPACE_ONLY, &realNsPtr, &dummyNsPtr, &dummyNsPtr, &simpleName); if ((realNsPtr != NULL) && (simpleName != NULL)) { if ((cxtNsPtr == realNsPtr) || !(realNsPtr->flags & NS_DEAD)) { entryPtr = Tcl_FindHashEntry(&realNsPtr->cmdTable, simpleName); if (entryPtr != NULL) { | | | | | 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 | TCL_NAMESPACE_ONLY, &realNsPtr, &dummyNsPtr, &dummyNsPtr, &simpleName); if ((realNsPtr != NULL) && (simpleName != NULL)) { if ((cxtNsPtr == realNsPtr) || !(realNsPtr->flags & NS_DEAD)) { entryPtr = Tcl_FindHashEntry(&realNsPtr->cmdTable, simpleName); if (entryPtr != NULL) { cmdPtr = (Command *) Tcl_GetHashValue(entryPtr); } } } /* * Next, check along the path. */ for (i=0 ; (cmdPtr == NULL) && i<cxtNsPtr->commandPathLength ; i++) { pathNsPtr = cxtNsPtr->commandPathArray[i].nsPtr; if (pathNsPtr == NULL) { continue; } (void) TclGetNamespaceForQualName(interp, name, pathNsPtr, TCL_NAMESPACE_ONLY, &realNsPtr, &dummyNsPtr, &dummyNsPtr, &simpleName); if ((realNsPtr != NULL) && (simpleName != NULL) && !(realNsPtr->flags & NS_DEAD)) { entryPtr = Tcl_FindHashEntry(&realNsPtr->cmdTable, simpleName); if (entryPtr != NULL) { cmdPtr = (Command *) Tcl_GetHashValue(entryPtr); } } } /* * If we've still not found the command, look in the global namespace * as a last resort. */ if (cmdPtr == NULL) { (void) TclGetNamespaceForQualName(interp, name, NULL, TCL_GLOBAL_ONLY, &realNsPtr, &dummyNsPtr, &dummyNsPtr, &simpleName); if ((realNsPtr != NULL) && (simpleName != NULL) && !(realNsPtr->flags & NS_DEAD)) { entryPtr = Tcl_FindHashEntry(&realNsPtr->cmdTable, simpleName); if (entryPtr != NULL) { cmdPtr = (Command *) Tcl_GetHashValue(entryPtr); } } } } else { Namespace *nsPtr[2]; int search; |
︙ | ︙ | |||
2717 2718 2719 2720 2721 2722 2723 | */ for (search = 0; (search < 2) && (cmdPtr == NULL); search++) { if ((nsPtr[search] != NULL) && (simpleName != NULL)) { entryPtr = Tcl_FindHashEntry(&nsPtr[search]->cmdTable, simpleName); if (entryPtr != NULL) { | | | | 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 | */ for (search = 0; (search < 2) && (cmdPtr == NULL); search++) { if ((nsPtr[search] != NULL) && (simpleName != NULL)) { entryPtr = Tcl_FindHashEntry(&nsPtr[search]->cmdTable, simpleName); if (entryPtr != NULL) { cmdPtr = (Command *) Tcl_GetHashValue(entryPtr); } } } } if (cmdPtr != NULL) { cmdPtr->flags &= ~CMD_VIA_RESOLVER; return (Tcl_Command) cmdPtr; } if (flags & TCL_LEAVE_ERR_MSG) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "unknown command \"%s\"", name)); Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "COMMAND", name, (char *)NULL); |
︙ | ︙ | |||
2781 2782 2783 2784 2785 2786 2787 | Tcl_HashEntry *hPtr; Namespace *nsPtr; Namespace *trailNsPtr, *shadowNsPtr; Namespace *globalNsPtr = (Namespace *) TclGetGlobalNamespace(interp); int found, i; int trailFront = -1; int trailSize = 5; /* Formerly NUM_TRAIL_ELEMS. */ | | > | < < | < < < < < < < < | | 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 | Tcl_HashEntry *hPtr; Namespace *nsPtr; Namespace *trailNsPtr, *shadowNsPtr; Namespace *globalNsPtr = (Namespace *) TclGetGlobalNamespace(interp); int found, i; int trailFront = -1; int trailSize = 5; /* Formerly NUM_TRAIL_ELEMS. */ Namespace **trailPtr = (Namespace **) TclStackAlloc(interp, trailSize * sizeof(Namespace *)); /* * Start at the namespace containing the new command, and work up through * the list of parents. Stop just before the global namespace, since the * global namespace can't "shadow" its own entries. * * The namespace "trail" list we build consists of the names of each * namespace that encloses the new command, in order from outermost to * innermost: for example, "a" then "b". Each iteration of this loop * eventually extends the trail upwards by one namespace, nsPtr. We use * this trail list to see if nsPtr (e.g. "a" in 2. above) could have * now-invalid cached command references. This will happen if nsPtr * (e.g. "a") contains a sequence of child namespaces (e.g. "b") such that * there is a identically-named sequence of child namespaces starting from * :: (e.g. "::b") whose tail namespace contains a command also named * cmdName. */ cmdName = (char *) Tcl_GetHashKey(newCmdPtr->hPtr->tablePtr, newCmdPtr->hPtr); for (nsPtr=newCmdPtr->nsPtr ; (nsPtr!=NULL) && (nsPtr!=globalNsPtr) ; nsPtr=nsPtr->parentPtr) { /* * Find the maximal sequence of child namespaces contained in nsPtr * such that there is a identically-named sequence of child namespaces * starting from ::. shadowNsPtr will be the tail of this sequence, or * the deepest namespace under :: that might contain a command now * shadowed by cmdName. We check below if shadowNsPtr actually * contains a command cmdName. */ found = 1; shadowNsPtr = globalNsPtr; for (i = trailFront; i >= 0; i--) { trailNsPtr = trailPtr[i]; hPtr = FindChildEntry(shadowNsPtr, trailNsPtr->name); if (hPtr != NULL) { shadowNsPtr = (Namespace *) Tcl_GetHashValue(hPtr); } else { found = 0; break; } } /* |
︙ | ︙ | |||
2856 2857 2858 2859 2860 2861 2862 | /* * If the shadowed command was compiled to bytecodes, we * invalidate all the bytecodes in nsPtr, to force a new * compilation. We use the resolverEpoch to signal the need * for a fresh compilation of every bytecode. */ | | | > | | 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 | /* * If the shadowed command was compiled to bytecodes, we * invalidate all the bytecodes in nsPtr, to force a new * compilation. We use the resolverEpoch to signal the need * for a fresh compilation of every bytecode. */ if (((Command *) Tcl_GetHashValue(hPtr))->compileProc != NULL) { nsPtr->resolverEpoch++; } } } /* * Insert nsPtr at the front of the trail list: i.e., at the end of * the trailPtr array. */ trailFront++; if (trailFront == trailSize) { int newSize = 2 * trailSize; trailPtr = (Namespace **) TclStackRealloc(interp, trailPtr, newSize * sizeof(Namespace *)); trailSize = newSize; } trailPtr[trailFront] = nsPtr; } TclStackFree(interp, trailPtr); } |
︙ | ︙ | |||
2953 2954 2955 2956 2957 2958 2959 | * cross interps. */ nsPtr = resNamePtr->nsPtr; refNsPtr = resNamePtr->refNsPtr; if (!(nsPtr->flags & NS_DYING) && (interp == nsPtr->interp) && (!refNsPtr || (refNsPtr == | | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 | * cross interps. */ nsPtr = resNamePtr->nsPtr; refNsPtr = resNamePtr->refNsPtr; if (!(nsPtr->flags & NS_DYING) && (interp == nsPtr->interp) && (!refNsPtr || (refNsPtr == (Namespace *) TclGetCurrentNamespace(interp)))) { *nsPtrPtr = (Tcl_Namespace *) nsPtr; return TCL_OK; } Tcl_StoreInternalRep(objPtr, &nsNameType, NULL); } if (SetNsNameFromAny(interp, objPtr) == TCL_OK) { NsNameGetInternalRep(objPtr, resNamePtr); assert(resNamePtr != NULL); *nsPtrPtr = (Tcl_Namespace *) resNamePtr->nsPtr; return TCL_OK; } return TCL_ERROR; } /* *---------------------------------------------------------------------- * * TclNewNamespaceObj -- * * Gets an object that contains a reference to a given namespace. * * Note that this gets the name of the namespace immediately; this means * that the name is guaranteed to persist even if the namespace is * deleted. (This is checked by test namespace-7.1.) * * Results: * Returns a newly-allocated Tcl_Obj. * * Side effects: * None. * *---------------------------------------------------------------------- */ Tcl_Obj * TclNewNamespaceObj( Tcl_Namespace *namespacePtr) { Namespace *nsPtr = (Namespace *) namespacePtr; Tcl_Size len; Tcl_Obj *objPtr; /* * If NS_DEAD set, we have no name any more; the fullName field may have * been deallocated. */ assert(!(nsPtr->flags & NS_DEAD)); /* * Need to get the name pro-actively; the name must persist after the * namespace is deleted. This is the easiest way. */ len = strlen(nsPtr->fullName); TclNewStringObj(objPtr, nsPtr->fullName, len); /* * But we know exactly which namespace this resolves to. Remember that * unless things are already being taken apart. */ if (!(nsPtr->flags & (NS_DYING | NS_TEARDOWN))) { ResolvedNsName *resNamePtr = (ResolvedNsName *) Tcl_Alloc(sizeof(ResolvedNsName)); resNamePtr->nsPtr = nsPtr; resNamePtr->refNsPtr = NULL; resNamePtr->refCount = 0; nsPtr->refCount++; NsNameSetInternalRep(objPtr, resNamePtr); } return objPtr; } /* *---------------------------------------------------------------------- * * TclInitNamespaceCmd -- * * This function is called to create the "namespace" Tcl command. See the |
︙ | ︙ | |||
3027 3028 3029 3030 3031 3032 3033 | Tcl_Namespace *namespacePtr; Namespace *nsPtr, *childNsPtr; Namespace *globalNsPtr = (Namespace *) TclGetGlobalNamespace(interp); const char *pattern = NULL; Tcl_DString buffer; Tcl_HashEntry *entryPtr; Tcl_HashSearch search; | | | | 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 | Tcl_Namespace *namespacePtr; Namespace *nsPtr, *childNsPtr; Namespace *globalNsPtr = (Namespace *) TclGetGlobalNamespace(interp); const char *pattern = NULL; Tcl_DString buffer; Tcl_HashEntry *entryPtr; Tcl_HashSearch search; Tcl_Obj *listPtr; /* * Get a pointer to the specified namespace, or the current namespace. */ if (objc == 1) { nsPtr = (Namespace *) TclGetCurrentNamespace(interp); } else if ((objc == 2) || (objc == 3)) { if (TclGetNamespaceFromObj(interp, objv[1], &namespacePtr) != TCL_OK) { return TCL_ERROR; } nsPtr = (Namespace *) namespacePtr; } else { Tcl_WrongNumArgs(interp, 1, objv, "?name? ?pattern?"); return TCL_ERROR; } |
︙ | ︙ | |||
3077 3078 3079 3080 3081 3082 3083 | listPtr = Tcl_NewListObj(0, NULL); if ((pattern != NULL) && TclMatchIsTrivial(pattern)) { size_t length = strlen(nsPtr->fullName); if (strncmp(pattern, nsPtr->fullName, length) != 0) { goto searchDone; } | < < < < < | < < | < | < < < < < < | < | > | 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 | listPtr = Tcl_NewListObj(0, NULL); if ((pattern != NULL) && TclMatchIsTrivial(pattern)) { size_t length = strlen(nsPtr->fullName); if (strncmp(pattern, nsPtr->fullName, length) != 0) { goto searchDone; } if (FindChildEntry(nsPtr, pattern+length) != NULL) { Tcl_ListObjAppendElement(NULL, listPtr, Tcl_NewStringObj(pattern, -1)); } goto searchDone; } entryPtr = FirstChildEntry(nsPtr, &search); while (entryPtr != NULL) { childNsPtr = (Namespace *) Tcl_GetHashValue(entryPtr); if ((pattern == NULL) || Tcl_StringMatch(childNsPtr->fullName, pattern)) { Tcl_ListObjAppendElement(NULL, listPtr, TclNewNamespaceObj((Tcl_Namespace *) childNsPtr)); } entryPtr = Tcl_NextHashEntry(&search); } searchDone: Tcl_SetObjResult(interp, listPtr); Tcl_DStringFree(&buffer); |
︙ | ︙ | |||
3149 3150 3151 3152 3153 3154 3155 | static int NamespaceCodeCmd( TCL_UNUSED(void *), Tcl_Interp *interp, /* Current interpreter. */ int objc, /* Number of arguments. */ Tcl_Obj *const objv[]) /* Argument objects. */ { | < | 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 | static int NamespaceCodeCmd( TCL_UNUSED(void *), Tcl_Interp *interp, /* Current interpreter. */ int objc, /* Number of arguments. */ Tcl_Obj *const objv[]) /* Argument objects. */ { Tcl_Obj *listPtr, *objPtr; const char *arg; Tcl_Size length; if (objc != 2) { Tcl_WrongNumArgs(interp, 1, objv, "arg"); return TCL_ERROR; |
︙ | ︙ | |||
3184 3185 3186 3187 3188 3189 3190 | * argument "arg". By constructing a list, we ensure that scoped commands * are interpreted properly when they are executed later, by the * "namespace inscope" command. */ TclNewObj(listPtr); TclNewLiteralStringObj(objPtr, "::namespace"); | | < < < < | < | | | | | | 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 | * argument "arg". By constructing a list, we ensure that scoped commands * are interpreted properly when they are executed later, by the * "namespace inscope" command. */ TclNewObj(listPtr); TclNewLiteralStringObj(objPtr, "::namespace"); Tcl_ListObjAppendElement(NULL, listPtr, objPtr); TclNewLiteralStringObj(objPtr, "inscope"); Tcl_ListObjAppendElement(NULL, listPtr, objPtr); Tcl_ListObjAppendElement(NULL, listPtr, TclNewNamespaceObj(TclGetCurrentNamespace(interp))); Tcl_ListObjAppendElement(NULL, listPtr, objv[1]); Tcl_SetObjResult(interp, listPtr); return TCL_OK; } /* *---------------------------------------------------------------------- |
︙ | ︙ | |||
3230 3231 3232 3233 3234 3235 3236 | static int NamespaceCurrentCmd( TCL_UNUSED(void *), Tcl_Interp *interp, /* Current interpreter. */ int objc, /* Number of arguments. */ Tcl_Obj *const objv[]) /* Argument objects. */ { | < < > > < < | < | < | 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 | static int NamespaceCurrentCmd( TCL_UNUSED(void *), Tcl_Interp *interp, /* Current interpreter. */ int objc, /* Number of arguments. */ Tcl_Obj *const objv[]) /* Argument objects. */ { if (objc != 1) { Tcl_WrongNumArgs(interp, 1, objv, NULL); return TCL_ERROR; } /* * The "real" name of the global namespace ("::") is the null string, but * we return "::" for it as a convenience to programmers. Note that "" and * "::" are treated as synonyms by the namespace code so that it is still * easy to do things like: * * namespace [namespace current]::bar { ... } * * This behavior is encoded into TclNewNamespaceObj(). */ Tcl_SetObjResult(interp, TclNewNamespaceObj(TclGetCurrentNamespace(interp))); return TCL_OK; } /* *---------------------------------------------------------------------- * * NamespaceDeleteCmd -- |
︙ | ︙ | |||
3365 3366 3367 3368 3369 3370 3371 | * result. * *---------------------------------------------------------------------- */ static int NamespaceEvalCmd( | | | 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 | * result. * *---------------------------------------------------------------------- */ static int NamespaceEvalCmd( void *clientData, /* Arbitrary value passed to cmd. */ Tcl_Interp *interp, /* Current interpreter. */ int objc, /* Number of arguments. */ Tcl_Obj *const objv[]) /* Argument objects. */ { return Tcl_NRCallObjProc(interp, NRNamespaceEvalCmd, clientData, objc, objv); } |
︙ | ︙ | |||
3462 3463 3464 3465 3466 3467 3468 | static int NsEval_Callback( void *data[], Tcl_Interp *interp, int result) { | | | | 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 | static int NsEval_Callback( void *data[], Tcl_Interp *interp, int result) { Tcl_Namespace *namespacePtr = (Tcl_Namespace *) data[0]; if (result == TCL_ERROR) { size_t length = strlen(namespacePtr->fullName); unsigned limit = 200; int overflow = (length > limit); char *cmd = (char *) data[1]; Tcl_AppendObjToErrorInfo(interp, Tcl_ObjPrintf( "\n (in namespace %s \"%.*s%s\" script line %d)", cmd, (overflow ? limit : (unsigned)length), namespacePtr->fullName, (overflow ? "..." : ""), Tcl_GetErrorLine(interp))); } |
︙ | ︙ | |||
3584 3585 3586 3587 3588 3589 3590 | * the namespace's current export pattern list. */ if (objc == 1) { Tcl_Obj *listPtr; TclNewObj(listPtr); | | | 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 | * the namespace's current export pattern list. */ if (objc == 1) { Tcl_Obj *listPtr; TclNewObj(listPtr); (void) Tcl_AppendExportList(interp, NULL, listPtr); Tcl_SetObjResult(interp, listPtr); return TCL_OK; } /* * Process the optional "-clear" argument. */ |
︙ | ︙ | |||
3750 3751 3752 3753 3754 3755 3756 | Tcl_HashSearch search; Namespace *nsPtr = (Namespace *) TclGetCurrentNamespace(interp); Tcl_Obj *listPtr; TclNewObj(listPtr); for (hPtr = Tcl_FirstHashEntry(&nsPtr->cmdTable, &search); hPtr != NULL; hPtr = Tcl_NextHashEntry(&search)) { | | | | 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 | Tcl_HashSearch search; Namespace *nsPtr = (Namespace *) TclGetCurrentNamespace(interp); Tcl_Obj *listPtr; TclNewObj(listPtr); for (hPtr = Tcl_FirstHashEntry(&nsPtr->cmdTable, &search); hPtr != NULL; hPtr = Tcl_NextHashEntry(&search)) { Command *cmdPtr = (Command *) Tcl_GetHashValue(hPtr); if (cmdPtr->deleteProc == DeleteImportedCmd) { Tcl_ListObjAppendElement(NULL, listPtr, Tcl_NewStringObj( (char *) Tcl_GetHashKey(&nsPtr->cmdTable, hPtr), -1)); } } Tcl_SetObjResult(interp, listPtr); return TCL_OK; } /* |
︙ | ︙ | |||
3814 3815 3816 3817 3818 3819 3820 | * Returns a result in the Tcl interpreter's result object. * *---------------------------------------------------------------------- */ static int NamespaceInscopeCmd( | | < | 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 | * Returns a result in the Tcl interpreter's result object. * *---------------------------------------------------------------------- */ static int NamespaceInscopeCmd( void *clientData, /* Arbitrary value passed to cmd. */ Tcl_Interp *interp, /* Current interpreter. */ int objc, /* Number of arguments. */ Tcl_Obj *const objv[]) /* Argument objects. */ { return Tcl_NRCallObjProc(interp, NRNamespaceInscopeCmd, clientData, objc, objv); } static int NRNamespaceInscopeCmd( TCL_UNUSED(void *), Tcl_Interp *interp, /* Current interpreter. */ int objc, /* Number of arguments. */ Tcl_Obj *const objv[]) /* Argument objects. */ { Tcl_Namespace *namespacePtr; CallFrame *framePtr, **framePtrPtr; Tcl_Obj *cmdObjPtr; if (objc < 3) { Tcl_WrongNumArgs(interp, 1, objv, "name arg ?arg...?"); return TCL_ERROR; } |
︙ | ︙ | |||
3870 3871 3872 3873 3874 3875 3876 | * of extra arguments to form the command to evaluate. */ if (objc == 3) { cmdObjPtr = objv[2]; } else { Tcl_Obj *concatObjv[2]; | < < < < < < < < < | | | 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 | * of extra arguments to form the command to evaluate. */ if (objc == 3) { cmdObjPtr = objv[2]; } else { Tcl_Obj *concatObjv[2]; concatObjv[0] = objv[2]; concatObjv[1] = Tcl_NewListObj(objc - 3, objv + 3); cmdObjPtr = Tcl_ConcatObj(2, concatObjv); Tcl_DecrRefCount(concatObjv[1]); /* We're done with the list object. */ } TclNRAddCallback(interp, NsEval_Callback, namespacePtr, "inscope", NULL, NULL); return TclNREvalObjEx(interp, cmdObjPtr, 0, NULL, 0); } |
︙ | ︙ | |||
3945 3946 3947 3948 3949 3950 3951 | } origCmd = TclGetOriginalCommand(cmd); if (origCmd == NULL) { origCmd = cmd; } TclNewObj(resultPtr); Tcl_GetCommandFullName(interp, origCmd, resultPtr); | | | < < < < < > > > > > > > | 4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 4047 4048 | } origCmd = TclGetOriginalCommand(cmd); if (origCmd == NULL) { origCmd = cmd; } TclNewObj(resultPtr); Tcl_GetCommandFullName(interp, origCmd, resultPtr); if (TclCheckEmptyString(resultPtr) == TCL_EMPTYSTRING_YES) { Tcl_DecrRefCount(resultPtr); goto namespaceOriginError; } Tcl_SetObjResult(interp, resultPtr); return TCL_OK; namespaceOriginError: Tcl_SetObjResult(interp, Tcl_ObjPrintf( "invalid command name \"%s\"", TclGetString(objv[1]))); Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "COMMAND", TclGetString(objv[1]), (char *)NULL); return TCL_ERROR; } /* *---------------------------------------------------------------------- * * NamespaceParentCmd -- * |
︙ | ︙ | |||
4004 4005 4006 4007 4008 4009 4010 | } /* * Report the parent of the specified namespace. */ if (nsPtr->parentPtr != NULL) { | | < | 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 | } /* * Report the parent of the specified namespace. */ if (nsPtr->parentPtr != NULL) { Tcl_SetObjResult(interp, TclNewNamespaceObj(nsPtr->parentPtr)); } return TCL_OK; } /* *---------------------------------------------------------------------- * |
︙ | ︙ | |||
4065 4066 4067 4068 4069 4070 4071 | if (objc == 1) { Tcl_Obj *resultObj; TclNewObj(resultObj); for (i=0 ; i<nsPtr->commandPathLength ; i++) { if (nsPtr->commandPathArray[i].nsPtr != NULL) { | | | | | | 4143 4144 4145 4146 4147 4148 4149 4150 4151 4152 4153 4154 4155 4156 4157 4158 4159 4160 4161 4162 4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 | if (objc == 1) { Tcl_Obj *resultObj; TclNewObj(resultObj); for (i=0 ; i<nsPtr->commandPathLength ; i++) { if (nsPtr->commandPathArray[i].nsPtr != NULL) { Tcl_ListObjAppendElement(NULL, resultObj, TclNewNamespaceObj( (Tcl_Namespace *) nsPtr->commandPathArray[i].nsPtr)); } } Tcl_SetObjResult(interp, resultObj); return TCL_OK; } /* * There is a path given, so parse it into an array of namespace pointers. */ if (TclListObjGetElements(interp, objv[1], &nsObjc, &nsObjv) != TCL_OK) { goto badNamespace; } if (nsObjc != 0) { namespaceList = (Tcl_Namespace **) TclStackAlloc(interp, sizeof(Tcl_Namespace *) * nsObjc); for (i = 0; i < nsObjc; i++) { if (TclGetNamespaceFromObj(interp, nsObjv[i], &namespaceList[i]) != TCL_OK) { goto badNamespace; } } |
︙ | ︙ | |||
4133 4134 4135 4136 4137 4138 4139 | void TclSetNsPath( Namespace *nsPtr, /* Namespace whose path is to be set. */ Tcl_Size pathLength, /* Length of pathAry. */ Tcl_Namespace *pathAry[]) /* Array of namespaces that are the path. */ { if (pathLength != 0) { | | | | 4211 4212 4213 4214 4215 4216 4217 4218 4219 4220 4221 4222 4223 4224 4225 4226 | void TclSetNsPath( Namespace *nsPtr, /* Namespace whose path is to be set. */ Tcl_Size pathLength, /* Length of pathAry. */ Tcl_Namespace *pathAry[]) /* Array of namespaces that are the path. */ { if (pathLength != 0) { NamespacePathEntry *tmpPathArray = (NamespacePathEntry *) Tcl_Alloc(sizeof(NamespacePathEntry) * pathLength); Tcl_Size i; for (i=0 ; i<pathLength ; i++) { tmpPathArray[i].nsPtr = (Namespace *) pathAry[i]; tmpPathArray[i].creatorNsPtr = nsPtr; tmpPathArray[i].prevPtr = NULL; tmpPathArray[i].nextPtr = |
︙ | ︙ | |||
4729 4730 4731 4732 4733 4734 4735 | * the namespace, it's structure will be freed. * *---------------------------------------------------------------------- */ static void FreeNsNameInternalRep( | | | 4807 4808 4809 4810 4811 4812 4813 4814 4815 4816 4817 4818 4819 4820 4821 | * the namespace, it's structure will be freed. * *---------------------------------------------------------------------- */ static void FreeNsNameInternalRep( Tcl_Obj *objPtr) /* nsName object with internal representation * to free. */ { ResolvedNsName *resNamePtr; NsNameGetInternalRep(objPtr, resNamePtr); assert(resNamePtr != NULL); |
︙ | ︙ | |||
4776 4777 4778 4779 4780 4781 4782 | * *---------------------------------------------------------------------- */ static void DupNsNameInternalRep( Tcl_Obj *srcPtr, /* Object with internal rep to copy. */ | | | 4854 4855 4856 4857 4858 4859 4860 4861 4862 4863 4864 4865 4866 4867 4868 | * *---------------------------------------------------------------------- */ static void DupNsNameInternalRep( Tcl_Obj *srcPtr, /* Object with internal rep to copy. */ Tcl_Obj *copyPtr) /* Object with internal rep to set. */ { ResolvedNsName *resNamePtr; NsNameGetInternalRep(srcPtr, resNamePtr); assert(resNamePtr != NULL); NsNameSetInternalRep(copyPtr, resNamePtr); } |
︙ | ︙ | |||
4812 4813 4814 4815 4816 4817 4818 | */ static int SetNsNameFromAny( Tcl_Interp *interp, /* Points to the namespace in which to resolve * name. Also used for error reporting if not * NULL. */ | | | 4890 4891 4892 4893 4894 4895 4896 4897 4898 4899 4900 4901 4902 4903 4904 | */ static int SetNsNameFromAny( Tcl_Interp *interp, /* Points to the namespace in which to resolve * name. Also used for error reporting if not * NULL. */ Tcl_Obj *objPtr) /* The object to convert. */ { const char *dummy; Namespace *nsPtr, *dummy1Ptr, *dummy2Ptr; ResolvedNsName *resNamePtr; const char *name; if (interp == NULL) { |
︙ | ︙ | |||
4837 4838 4839 4840 4841 4842 4843 | /* * If we found a namespace, then create a new ResolvedNsName structure * that holds a reference to it. */ nsPtr->refCount++; | | | | 4915 4916 4917 4918 4919 4920 4921 4922 4923 4924 4925 4926 4927 4928 4929 4930 4931 4932 4933 4934 | /* * If we found a namespace, then create a new ResolvedNsName structure * that holds a reference to it. */ nsPtr->refCount++; resNamePtr = (ResolvedNsName *) Tcl_Alloc(sizeof(ResolvedNsName)); resNamePtr->nsPtr = nsPtr; if ((name[0] == ':') && (name[1] == ':')) { resNamePtr->refNsPtr = NULL; } else { resNamePtr->refNsPtr = (Namespace *) TclGetCurrentNamespace(interp); } resNamePtr->refCount = 0; NsNameSetInternalRep(objPtr, resNamePtr); return TCL_OK; } /* |
︙ | ︙ | |||
4897 4898 4899 4900 4901 4902 4903 | Tcl_Namespace *nsPtr) { Namespace *nPtr = (Namespace *) nsPtr; #ifndef BREAK_NAMESPACE_COMPAT return &nPtr->childTable; #else if (nPtr->childTablePtr == NULL) { | | > | 4975 4976 4977 4978 4979 4980 4981 4982 4983 4984 4985 4986 4987 4988 4989 4990 | Tcl_Namespace *nsPtr) { Namespace *nPtr = (Namespace *) nsPtr; #ifndef BREAK_NAMESPACE_COMPAT return &nPtr->childTable; #else if (nPtr->childTablePtr == NULL) { nPtr->childTablePtr = (Tcl_HashTable *) Tcl_Alloc(sizeof(Tcl_HashTable)); Tcl_InitHashTable(nPtr->childTablePtr, TCL_STRING_KEYS); } return nPtr->childTablePtr; #endif } /* |
︙ | ︙ | |||
4984 4985 4986 4987 4988 4989 4990 | if ((varPtr == NULL) || !TclIsVarTraced(varPtr)) { /* * Should not happen. */ return; } else { | < | | | 5063 5064 5065 5066 5067 5068 5069 5070 5071 5072 5073 5074 5075 5076 5077 5078 | if ((varPtr == NULL) || !TclIsVarTraced(varPtr)) { /* * Should not happen. */ return; } else { Tcl_HashEntry *hPtr = Tcl_FindHashEntry(&iPtr->varTraces, varPtr); VarTrace *tracePtr = (VarTrace *) Tcl_GetHashValue(hPtr); if (tracePtr->traceProc != EstablishErrorInfoTraces) { /* * The most recent trace set on ::errorInfo is not the one the * core itself puts on last. This means some other code is * tracing the variable, and the additional trace(s) might be * write traces that expect the timing of writes to |
︙ | ︙ |
Changes to generic/tclOO.c.
︙ | ︙ | |||
13 14 15 16 17 18 19 | #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "tclInt.h" #include "tclOOInt.h" /* | | | 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "tclInt.h" #include "tclOOInt.h" /* * Commands in oo::define and oo::objdefine. */ static const struct { const char *name; Tcl_ObjCmdProc *objProc; int flag; } defineCmds[] = { |
︙ | ︙ | |||
63 64 65 66 67 68 69 | static Object * AllocObject(Tcl_Interp *interp, const char *nameStr, Namespace *nsPtr, const char *nsNameStr); static int CloneClassMethod(Tcl_Interp *interp, Class *clsPtr, Method *mPtr, Tcl_Obj *namePtr, Method **newMPtrPtr); static int CloneObjectMethod(Tcl_Interp *interp, Object *oPtr, Method *mPtr, Tcl_Obj *namePtr); | < < | 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | static Object * AllocObject(Tcl_Interp *interp, const char *nameStr, Namespace *nsPtr, const char *nsNameStr); static int CloneClassMethod(Tcl_Interp *interp, Class *clsPtr, Method *mPtr, Tcl_Obj *namePtr, Method **newMPtrPtr); static int CloneObjectMethod(Tcl_Interp *interp, Object *oPtr, Method *mPtr, Tcl_Obj *namePtr); static void DeletedHelpersNamespace(void *clientData); static Tcl_NRPostProc FinalizeAlloc; static Tcl_NRPostProc FinalizeNext; static Tcl_NRPostProc FinalizeObjectCall; static inline void InitClassPath(Tcl_Interp * interp, Class *clsPtr); static void InitClassSystemRoots(Tcl_Interp *interp, Foundation *fPtr); |
︙ | ︙ | |||
116 117 118 119 120 121 122 123 124 125 126 127 128 129 | DCM("varname", 0, TclOO_Object_VarName), {NULL, 0, {0, NULL, NULL, NULL, NULL}} }, clsMethods[] = { DCM("create", 1, TclOO_Class_Create), DCM("new", 1, TclOO_Class_New), DCM("createWithNamespace", 0, TclOO_Class_CreateNs), {NULL, 0, {0, NULL, NULL, NULL, NULL}} }; /* * And for the oo::class constructor... */ static const Tcl_MethodType classConstructor = { | > > > | 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 | DCM("varname", 0, TclOO_Object_VarName), {NULL, 0, {0, NULL, NULL, NULL, NULL}} }, clsMethods[] = { DCM("create", 1, TclOO_Class_Create), DCM("new", 1, TclOO_Class_New), DCM("createWithNamespace", 0, TclOO_Class_CreateNs), {NULL, 0, {0, NULL, NULL, NULL, NULL}} }, cfgMethods[] = { DCM("configure", 1, TclOO_Configurable_Configure), {NULL, 0, {0, NULL, NULL, NULL, NULL}} }; /* * And for the oo::class constructor... */ static const Tcl_MethodType classConstructor = { |
︙ | ︙ | |||
284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 | { return GetFoundation(interp); } /* * ---------------------------------------------------------------------- * * InitFoundation -- * * Set up the core of the OO core class system. This is a structure * holding references to the magical bits that need to be known about in * other places, plus the oo::object and oo::class classes. * * ---------------------------------------------------------------------- */ static int InitFoundation( Tcl_Interp *interp) { static Tcl_ThreadDataKey tsdKey; | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | > < < | < | < > > > | > | | > < < | < < < | < < | | > | | | < | | < | | | | < | | | > > > > > > > > > > > > > > > > > > > > > > | 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 | { return GetFoundation(interp); } /* * ---------------------------------------------------------------------- * * CreateCmdInNS -- * * Create a command in a namespace. Supports setting various * implementation functions, but not a deletion callback or a clientData; * it's suitable for use-cases in this file, no more. * * ---------------------------------------------------------------------- */ static inline void CreateCmdInNS( Tcl_Interp *interp, Tcl_Namespace *namespacePtr, const char *name, Tcl_ObjCmdProc *cmdProc, Tcl_ObjCmdProc *nreProc, CompileProc *compileProc) { Command *cmdPtr; if (cmdProc == NULL && nreProc == NULL) { Tcl_Panic("must supply at least one implementation function"); } cmdPtr = (Command *) TclCreateObjCommandInNs(interp, name, namespacePtr, cmdProc, NULL, NULL); cmdPtr->nreProc = nreProc; cmdPtr->compileProc = compileProc; } /* * ---------------------------------------------------------------------- * * InitFoundation -- * * Set up the core of the OO core class system. This is a structure * holding references to the magical bits that need to be known about in * other places, plus the oo::object and oo::class classes. * * ---------------------------------------------------------------------- */ static int InitFoundation( Tcl_Interp *interp) { static Tcl_ThreadDataKey tsdKey; ThreadLocalData *tsdPtr = (ThreadLocalData *) Tcl_GetThreadData(&tsdKey, sizeof(ThreadLocalData)); Foundation *fPtr = (Foundation *) Tcl_Alloc(sizeof(Foundation)); Tcl_Namespace *define, *objdef; Tcl_Obj *namePtr; size_t i; /* * Initialize the structure that holds the OO system core. This is * attached to the interpreter via an assocData entry; not very efficient, * but the best we can do without hacking the core more. */ memset(fPtr, 0, sizeof(Foundation)); ((Interp *) interp)->objectFoundation = fPtr; fPtr->interp = interp; fPtr->ooNs = Tcl_CreateNamespace(interp, "::oo", fPtr, NULL); Tcl_Export(interp, fPtr->ooNs, "[a-z]*", 1); define = Tcl_CreateNamespace(interp, "::oo::define", fPtr, NULL); objdef = Tcl_CreateNamespace(interp, "::oo::objdefine", fPtr, NULL); fPtr->helpersNs = Tcl_CreateNamespace(interp, "::oo::Helpers", fPtr, DeletedHelpersNamespace); Tcl_CreateNamespace(interp, "::oo::configuresupport", NULL, NULL); fPtr->epoch = 1; fPtr->tsdPtr = tsdPtr; TclNewLiteralStringObj(fPtr->unknownMethodNameObj, "unknown"); TclNewLiteralStringObj(fPtr->constructorName, "<constructor>"); TclNewLiteralStringObj(fPtr->destructorName, "<destructor>"); TclNewLiteralStringObj(fPtr->clonedName, "<cloned>"); TclNewLiteralStringObj(fPtr->defineName, "::oo::define"); TclNewLiteralStringObj(fPtr->myName, "my"); Tcl_IncrRefCount(fPtr->unknownMethodNameObj); Tcl_IncrRefCount(fPtr->constructorName); Tcl_IncrRefCount(fPtr->destructorName); Tcl_IncrRefCount(fPtr->clonedName); Tcl_IncrRefCount(fPtr->defineName); Tcl_IncrRefCount(fPtr->myName); TclCreateObjCommandInNs(interp, "UnknownDefinition", fPtr->ooNs, TclOOUnknownDefinition, NULL, NULL); TclNewLiteralStringObj(namePtr, "::oo::UnknownDefinition"); Tcl_SetNamespaceUnknownHandler(interp, define, namePtr); Tcl_SetNamespaceUnknownHandler(interp, objdef, namePtr); Tcl_BounceRefCount(namePtr); /* * Create the subcommands in the oo::define and oo::objdefine spaces. */ for (i = 0 ; defineCmds[i].name ; i++) { TclCreateObjCommandInNs(interp, defineCmds[i].name, define, defineCmds[i].objProc, INT2PTR(defineCmds[i].flag), NULL); } for (i = 0 ; objdefCmds[i].name ; i++) { TclCreateObjCommandInNs(interp, objdefCmds[i].name, objdef, objdefCmds[i].objProc, INT2PTR(objdefCmds[i].flag), NULL); } Tcl_CallWhenDeleted(interp, KillFoundation, NULL); /* * Create the special objects at the core of the object system. */ InitClassSystemRoots(interp, fPtr); /* * Basic method declarations for the core classes. */ for (i = 0 ; objMethods[i].name ; i++) { TclOONewBasicMethod(fPtr->objectCls, &objMethods[i]); } for (i = 0 ; clsMethods[i].name ; i++) { TclOONewBasicMethod(fPtr->classCls, &clsMethods[i]); } /* * Finish setting up the class of classes by marking the 'new' method as * private; classes, unlike general objects, must have explicit names. We * also need to create the constructor for classes. */ TclNewLiteralStringObj(namePtr, "new"); TclNewInstanceMethod(interp, (Tcl_Object) fPtr->classCls->thisPtr, namePtr /* keeps ref */, 0 /* private */, NULL, NULL); Tcl_BounceRefCount(namePtr); fPtr->classCls->constructorPtr = (Method *) TclNewMethod( (Tcl_Class) fPtr->classCls, NULL, 0, &classConstructor, NULL); /* * Create non-object commands and plug ourselves into the Tcl [info] * ensemble. */ CreateCmdInNS(interp, fPtr->helpersNs, "next", NULL, TclOONextObjCmd, TclCompileObjectNextCmd); CreateCmdInNS(interp, fPtr->helpersNs, "nextto", NULL, TclOONextToObjCmd, TclCompileObjectNextToCmd); CreateCmdInNS(interp, fPtr->helpersNs, "self", TclOOSelfObjCmd, NULL, TclCompileObjectSelfCmd); CreateCmdInNS(interp, fPtr->ooNs, "define", TclOODefineObjCmd, NULL, NULL); CreateCmdInNS(interp, fPtr->ooNs, "objdefine", TclOOObjDefObjCmd, NULL, NULL); CreateCmdInNS(interp, fPtr->ooNs, "copy", TclOOCopyObjectCmd, NULL, NULL); TclOOInitInfo(interp); /* * Now make the class of slots. */ if (TclOODefineSlots(fPtr) != TCL_OK) { return TCL_ERROR; } /* * Make the configurable class and install its standard defined method. */ Tcl_Object cfgCls = Tcl_NewObjectInstance(interp, (Tcl_Class) fPtr->classCls, "::oo::configuresupport::configurable", NULL, -1, NULL, 0); for (i = 0 ; cfgMethods[i].name ; i++) { TclOONewBasicMethod(((Object *) cfgCls)->classPtr, &cfgMethods[i]); } /* * Don't have handles to these namespaces, so use Tcl_CreateObjCommand. */ Tcl_CreateObjCommand(interp, "::oo::configuresupport::configurableobject::property", TclOODefinePropertyCmd, (void *) 1, NULL); Tcl_CreateObjCommand(interp, "::oo::configuresupport::configurableclass::property", TclOODefinePropertyCmd, (void *) 0, NULL); /* * Evaluate the remaining definitions, which are a compiled-in Tcl script. */ return Tcl_EvalEx(interp, tclOOSetupScript, TCL_INDEX_NONE, 0); } |
︙ | ︙ | |||
453 454 455 456 457 458 459 | Object fakeObject; Tcl_Obj *defNsName; /* Stand up a phony class for bootstrapping. */ fPtr->objectCls = &fakeCls; /* referenced in TclOOAllocClass to increment the refCount. */ fakeCls.thisPtr = &fakeObject; | | | | | 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 | Object fakeObject; Tcl_Obj *defNsName; /* Stand up a phony class for bootstrapping. */ fPtr->objectCls = &fakeCls; /* referenced in TclOOAllocClass to increment the refCount. */ fakeCls.thisPtr = &fakeObject; fakeObject.refCount = 0; // Do not increment an uninitialized value. fPtr->objectCls = TclOOAllocClass(interp, AllocObject(interp, "object", (Namespace *) fPtr->ooNs, NULL)); // Corresponding TclOODecrRefCount in KillFoundation AddRef(fPtr->objectCls->thisPtr); /* * This is why it is unnecessary in this routine to replace the * incremented reference count of fPtr->objectCls that was swallowed by * fakeObject. */ |
︙ | ︙ | |||
481 482 483 484 485 486 487 | fPtr->objectCls->thisPtr->flags |= ROOT_OBJECT; fPtr->objectCls->flags |= ROOT_OBJECT; TclNewLiteralStringObj(defNsName, "::oo::objdefine"); fPtr->objectCls->objDefinitionNs = defNsName; Tcl_IncrRefCount(defNsName); fPtr->classCls = TclOOAllocClass(interp, | | | | 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 | fPtr->objectCls->thisPtr->flags |= ROOT_OBJECT; fPtr->objectCls->flags |= ROOT_OBJECT; TclNewLiteralStringObj(defNsName, "::oo::objdefine"); fPtr->objectCls->objDefinitionNs = defNsName; Tcl_IncrRefCount(defNsName); fPtr->classCls = TclOOAllocClass(interp, AllocObject(interp, "class", (Namespace *) fPtr->ooNs, NULL)); // Corresponding TclOODecrRefCount in KillFoundation AddRef(fPtr->classCls->thisPtr); /* * Increment reference counts for each reference because these * relationships can be dynamically changed. * * Corresponding TclOODecrRefCount for all incremented refcounts is in |
︙ | ︙ | |||
523 524 525 526 527 528 529 | * Everything else is careful to prohibit looping. */ } /* * ---------------------------------------------------------------------- * | | | < < < < < < < < < < < < < < < < < < | | | > > > > > > > > > > > | 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 | * Everything else is careful to prohibit looping. */ } /* * ---------------------------------------------------------------------- * * DeletedHelpersNamespace -- * * Simple helper used to clear fields of the foundation when they no * longer hold useful information. * * ---------------------------------------------------------------------- */ static void DeletedHelpersNamespace( void *clientData) { Foundation *fPtr = (Foundation *) clientData; fPtr->helpersNs = NULL; } /* * ---------------------------------------------------------------------- * * KillFoundation -- * * Delete those parts of the OO core that are not deleted automatically * when the objects and classes themselves are destroyed. * * ---------------------------------------------------------------------- */ static void KillFoundation( TCL_UNUSED(void *), Tcl_Interp *interp) /* The interpreter containing the OO system * foundation. */ { Foundation *fPtr = GetFoundation(interp); TclDecrRefCount(fPtr->unknownMethodNameObj); TclDecrRefCount(fPtr->constructorName); TclDecrRefCount(fPtr->destructorName); TclDecrRefCount(fPtr->clonedName); TclDecrRefCount(fPtr->defineName); TclDecrRefCount(fPtr->myName); TclOODecrRefCount(fPtr->objectCls->thisPtr); TclOODecrRefCount(fPtr->classCls->thisPtr); Tcl_Free(fPtr); /* * Don't leave the interpreter field pointing to freed data. */ ((Interp *) interp)->objectFoundation = NULL; } /* * ---------------------------------------------------------------------- * * AllocObject -- * * Allocate an object of basic type. Does not splice the object into its * class's instance list. The caller must set the classPtr on the object * to either a class or NULL, call TclOOAddToInstances to add the object * to the class's instance list, and if the object itself is a class, use * call TclOOAddToSubclasses() to add it to the right class's list of * subclasses. * * Returns: * Pointer to the object structure created, or NULL if a specific * namespace was asked for but couldn't be created. * * ---------------------------------------------------------------------- */ static Object * AllocObject( Tcl_Interp *interp, /* Interpreter within which to create the * object. */ |
︙ | ︙ | |||
625 626 627 628 629 630 631 | { Foundation *fPtr = GetFoundation(interp); Object *oPtr; Command *cmdPtr; CommandTrace *tracePtr; size_t creationEpoch; | | | > > > > > > > | | < < | > | 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 | { Foundation *fPtr = GetFoundation(interp); Object *oPtr; Command *cmdPtr; CommandTrace *tracePtr; size_t creationEpoch; oPtr = (Object *) Tcl_Alloc(sizeof(Object)); memset(oPtr, 0, sizeof(Object)); /* * Every object has a namespace; make one. Note that this also normally * computes the creation epoch value for the object, a sequence number * that is unique to the object (and which allows us to manage method * caching without comparing pointers). * * When creating a namespace, we first check to see if the caller * specified the name for the namespace. If not, we generate namespace * names using the epoch until such time as a new namespace is actually * created. */ if (nsNameStr != NULL) { oPtr->namespacePtr = Tcl_CreateNamespace(interp, nsNameStr, oPtr, NULL); if (oPtr->namespacePtr == NULL) { /* * Couldn't make the specific namespace. Report as an error. * [Bug 154f0982f2] */ Tcl_Free(oPtr); return NULL; } creationEpoch = ++fPtr->tsdPtr->nsCount; goto configNamespace; } while (1) { char objName[10 + TCL_INTEGER_SPACE]; snprintf(objName, sizeof(objName), "::oo::Obj%" TCL_Z_MODIFIER "u", ++fPtr->tsdPtr->nsCount); oPtr->namespacePtr = Tcl_CreateNamespace(interp, objName, oPtr, NULL); if (oPtr->namespacePtr != NULL) { creationEpoch = fPtr->tsdPtr->nsCount; break; } /* |
︙ | ︙ | |||
721 722 723 724 725 726 727 | * Finally, create the object commands and initialize the trace on the * public command (so that the object structures are deleted when the * command is deleted). */ if (!nameStr) { nameStr = oPtr->namespacePtr->name; | | | | > | 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 | * Finally, create the object commands and initialize the trace on the * public command (so that the object structures are deleted when the * command is deleted). */ if (!nameStr) { nameStr = oPtr->namespacePtr->name; nsPtr = (Namespace *) oPtr->namespacePtr; if (nsPtr->parentPtr != NULL) { nsPtr = nsPtr->parentPtr; } } oPtr->command = TclCreateObjCommandInNs(interp, nameStr, (Tcl_Namespace *) nsPtr, TclOOPublicObjectCmd, oPtr, NULL); /* * Add the NRE command and trace directly. While this breaks a number of * abstractions, it is faster and we're inside Tcl here so we're allowed. */ cmdPtr = (Command *) oPtr->command; cmdPtr->nreProc = PublicNRObjectCmd; cmdPtr->tracePtr = tracePtr = (CommandTrace *) Tcl_Alloc(sizeof(CommandTrace)); tracePtr->traceProc = ObjectRenamedTrace; tracePtr->clientData = oPtr; tracePtr->flags = TCL_TRACE_RENAME|TCL_TRACE_DELETE; tracePtr->nextPtr = NULL; tracePtr->refCount = 1; oPtr->myCommand = TclNRCreateCommandInNs(interp, "my", oPtr->namespacePtr, |
︙ | ︙ | |||
787 788 789 790 791 792 793 | * of those commands when the object itself is deleted. * * ---------------------------------------------------------------------- */ static void MyDeleted( | | | | | | | 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 | * of those commands when the object itself is deleted. * * ---------------------------------------------------------------------- */ static void MyDeleted( void *clientData) /* Reference to the object whose [my] has been * squelched. */ { Object *oPtr = (Object *) clientData; oPtr->myCommand = NULL; } static void MyClassDeleted( void *clientData) { Object *oPtr = (Object *) clientData; oPtr->myclassCommand = NULL; } /* * ---------------------------------------------------------------------- * * ObjectRenamedTrace -- * * This callback is triggered when the object is deleted by any * mechanism. It runs the destructors and arranges for the actual cleanup * of the object's namespace, which in turn triggers cleansing of the * object data structures. * * ---------------------------------------------------------------------- */ static void ObjectRenamedTrace( void *clientData, /* The object being deleted. */ TCL_UNUSED(Tcl_Interp *), TCL_UNUSED(const char *) /*oldName*/, TCL_UNUSED(const char *) /*newName*/, int flags) /* Why was the object deleted? */ { Object *oPtr = (Object *) clientData; /* * If this is a rename and not a delete of the object, we just flush the * cache of the object name. */ if (flags & TCL_TRACE_RENAME) { |
︙ | ︙ | |||
962 963 964 965 966 967 968 | Object *oPtr) /* The object representing the class. */ { FOREACH_HASH_DECLS; Tcl_Size i; Class *clsPtr = oPtr->classPtr, *tmpClsPtr; Method *mPtr; Foundation *fPtr = oPtr->fPtr; | | | 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 | Object *oPtr) /* The object representing the class. */ { FOREACH_HASH_DECLS; Tcl_Size i; Class *clsPtr = oPtr->classPtr, *tmpClsPtr; Method *mPtr; Foundation *fPtr = oPtr->fPtr; Tcl_Obj *variableObj; PrivateVariableMapping *privateVariable; /* * Sanity check! */ if (!Destructing(oPtr)) { |
︙ | ︙ | |||
1019 1020 1021 1022 1023 1024 1025 | clsPtr->classChainCache = NULL; } /* * Squelch the property lists. */ | < < < < < < | < < < < < < < < < < < | 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 | clsPtr->classChainCache = NULL; } /* * Squelch the property lists. */ TclOOReleasePropertyStorage(&clsPtr->properties); /* * Squelch our filter list. */ if (clsPtr->filters.num) { Tcl_Obj *filterObj; |
︙ | ︙ | |||
1131 1132 1133 1134 1135 1136 1137 | * (interpreter teardown is complex!) * * ---------------------------------------------------------------------- */ static void ObjectNamespaceDeleted( | | | | | 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 | * (interpreter teardown is complex!) * * ---------------------------------------------------------------------- */ static void ObjectNamespaceDeleted( void *clientData) /* Pointer to the class whose namespace is * being deleted. */ { Object *oPtr = (Object *) clientData; Foundation *fPtr = oPtr->fPtr; FOREACH_HASH_DECLS; Class *mixinPtr; Method *mPtr; Tcl_Obj *filterObj, *variableObj; PrivateVariableMapping *privateVariable; Tcl_Interp *interp = oPtr->fPtr->interp; Tcl_Size i; if (Destructing(oPtr)) { /* * TODO: Can ObjectNamespaceDeleted ever be called twice? If not, |
︙ | ︙ | |||
1216 1217 1218 1219 1220 1221 1222 | */ } else { /* * The namespace must have been deleted directly. Delete the command * as well. */ | | | | | | 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 | */ } else { /* * The namespace must have been deleted directly. Delete the command * as well. */ Tcl_DeleteCommandFromToken(interp, oPtr->command); } if (oPtr->myclassCommand) { Tcl_DeleteCommandFromToken(interp, oPtr->myclassCommand); } if (oPtr->myCommand) { Tcl_DeleteCommandFromToken(interp, oPtr->myCommand); } /* * Splice the object out of its context. After this, we must *not* call * methods on the object. */ // TODO: Should this be protected with a !IsRoot() condition? TclOORemoveFromInstances(oPtr, oPtr->selfCls); if (oPtr->mixins.num > 0) { FOREACH(mixinPtr, oPtr->mixins) { TclOORemoveFromInstances(oPtr, mixinPtr); TclOODecrRefCount(mixinPtr->thisPtr); } |
︙ | ︙ | |||
1296 1297 1298 1299 1300 1301 1302 | oPtr->metadataPtr = NULL; } /* * Squelch the property lists. */ | < < < < < < | < < < < < < < < < < < | 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 | oPtr->metadataPtr = NULL; } /* * Squelch the property lists. */ TclOOReleasePropertyStorage(&oPtr->properties); /* * Because an object can be a class that is an instance of itself, the * class object's class structure should only be cleaned after most of * the cleanup on the object is done. * * The class of objects needs some special care; if it is deleted (and |
︙ | ︙ | |||
1340 1341 1342 1343 1344 1345 1346 | TclOOReleaseClassContents(interp, oPtr); } /* * Delete the object structure itself. */ | | | 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 | TclOOReleaseClassContents(interp, oPtr); } /* * Delete the object structure itself. */ TclNsDecrRefCount((Namespace *) oPtr->namespacePtr); oPtr->namespacePtr = NULL; TclOODecrRefCount(oPtr->selfCls->thisPtr); oPtr->selfCls = NULL; TclOODecrRefCount(oPtr); return; } |
︙ | ︙ | |||
1445 1446 1447 1448 1449 1450 1451 | Class *clsPtr) /* The class to add the instance to. It is * assumed that the class is not already * present as an instance in the class. */ { if (clsPtr->instances.num >= clsPtr->instances.size) { clsPtr->instances.size += ALLOC_CHUNK; if (clsPtr->instances.size == ALLOC_CHUNK) { | | > | > | | 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 | Class *clsPtr) /* The class to add the instance to. It is * assumed that the class is not already * present as an instance in the class. */ { if (clsPtr->instances.num >= clsPtr->instances.size) { clsPtr->instances.size += ALLOC_CHUNK; if (clsPtr->instances.size == ALLOC_CHUNK) { clsPtr->instances.list = (Object **) Tcl_Alloc(sizeof(Object *) * ALLOC_CHUNK); } else { clsPtr->instances.list = (Object **) Tcl_Realloc(clsPtr->instances.list, sizeof(Object *) * clsPtr->instances.size); } } clsPtr->instances.list[clsPtr->instances.num++] = oPtr; AddRef(oPtr); } /* |
︙ | ︙ | |||
1546 1547 1548 1549 1550 1551 1552 | { if (Destructing(superPtr->thisPtr)) { return; } if (superPtr->subclasses.num >= superPtr->subclasses.size) { superPtr->subclasses.size += ALLOC_CHUNK; if (superPtr->subclasses.size == ALLOC_CHUNK) { | | > | > | | 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 | { if (Destructing(superPtr->thisPtr)) { return; } if (superPtr->subclasses.num >= superPtr->subclasses.size) { superPtr->subclasses.size += ALLOC_CHUNK; if (superPtr->subclasses.size == ALLOC_CHUNK) { superPtr->subclasses.list = (Class **) Tcl_Alloc(sizeof(Class *) * ALLOC_CHUNK); } else { superPtr->subclasses.list = (Class **) Tcl_Realloc(superPtr->subclasses.list, sizeof(Class *) * superPtr->subclasses.size); } } superPtr->subclasses.list[superPtr->subclasses.num++] = subPtr; AddRef(subPtr->thisPtr); } /* |
︙ | ︙ | |||
1612 1613 1614 1615 1616 1617 1618 | { if (Destructing(superPtr->thisPtr)) { return; } if (superPtr->mixinSubs.num >= superPtr->mixinSubs.size) { superPtr->mixinSubs.size += ALLOC_CHUNK; if (superPtr->mixinSubs.size == ALLOC_CHUNK) { | | > | > | | 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 | { if (Destructing(superPtr->thisPtr)) { return; } if (superPtr->mixinSubs.num >= superPtr->mixinSubs.size) { superPtr->mixinSubs.size += ALLOC_CHUNK; if (superPtr->mixinSubs.size == ALLOC_CHUNK) { superPtr->mixinSubs.list = (Class **) Tcl_Alloc(sizeof(Class *) * ALLOC_CHUNK); } else { superPtr->mixinSubs.list = (Class **) Tcl_Realloc(superPtr->mixinSubs.list, sizeof(Class *) * superPtr->mixinSubs.size); } } superPtr->mixinSubs.list[superPtr->mixinSubs.num++] = subPtr; AddRef(subPtr->thisPtr); } /* |
︙ | ︙ | |||
1660 1661 1662 1663 1664 1665 1666 | TclOOAllocClass( Tcl_Interp *interp, /* Interpreter within which to allocate the * class. */ Object *useThisObj) /* Object that is to act as the class * representation. */ { Foundation *fPtr = GetFoundation(interp); | | | | 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 | TclOOAllocClass( Tcl_Interp *interp, /* Interpreter within which to allocate the * class. */ Object *useThisObj) /* Object that is to act as the class * representation. */ { Foundation *fPtr = GetFoundation(interp); Class *clsPtr = (Class *) Tcl_Alloc(sizeof(Class)); memset(clsPtr, 0, sizeof(Class)); clsPtr->thisPtr = useThisObj; /* * Configure the namespace path for the class's object. */ InitClassPath(interp, clsPtr); /* * Classes are subclasses of oo::object, i.e. the objects they create are * objects. */ clsPtr->superclasses.num = 1; clsPtr->superclasses.list = (Class **) Tcl_Alloc(sizeof(Class *)); clsPtr->superclasses.list[0] = fPtr->objectCls; AddRef(fPtr->objectCls->thisPtr); /* * Finish connecting the class structure to the object structure. */ |
︙ | ︙ | |||
1714 1715 1716 1717 1718 1719 1720 | Tcl_Interp *interp, /* Interpreter context. */ Tcl_Class cls, /* Class to create an instance of. */ const char *nameStr, /* Name of object to create, or NULL to ask * the code to pick its own unique name. */ const char *nsNameStr, /* Name of namespace to create inside object, * or NULL to ask the code to pick its own * unique name. */ | | | | 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 | Tcl_Interp *interp, /* Interpreter context. */ Tcl_Class cls, /* Class to create an instance of. */ const char *nameStr, /* Name of object to create, or NULL to ask * the code to pick its own unique name. */ const char *nsNameStr, /* Name of namespace to create inside object, * or NULL to ask the code to pick its own * unique name. */ Tcl_Size objc, /* Number of arguments. Negative value means * do not call constructor. */ Tcl_Obj *const *objv, /* Argument list. */ Tcl_Size skip) /* Number of arguments to _not_ pass to the * constructor. */ { Class *classPtr = (Class *) cls; Object *oPtr; void *clientData[4]; oPtr = TclNewObjectInstanceCommon(interp, classPtr, nameStr, nsNameStr); |
︙ | ︙ | |||
1782 1783 1784 1785 1786 1787 1788 | Tcl_Interp *interp, /* Interpreter context. */ Tcl_Class cls, /* Class to create an instance of. */ const char *nameStr, /* Name of object to create, or NULL to ask * the code to pick its own unique name. */ const char *nsNameStr, /* Name of namespace to create inside object, * or NULL to ask the code to pick its own * unique name. */ | | | | 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 | Tcl_Interp *interp, /* Interpreter context. */ Tcl_Class cls, /* Class to create an instance of. */ const char *nameStr, /* Name of object to create, or NULL to ask * the code to pick its own unique name. */ const char *nsNameStr, /* Name of namespace to create inside object, * or NULL to ask the code to pick its own * unique name. */ Tcl_Size objc, /* Number of arguments. Negative value means * do not call constructor. */ Tcl_Obj *const *objv, /* Argument list. */ Tcl_Size skip, /* Number of arguments to _not_ pass to the * constructor. */ Tcl_Object *objectPtr) /* Place to write the object reference upon * successful allocation. */ { Class *classPtr = (Class *) cls; CallContext *contextPtr; Tcl_InterpState state; |
︙ | ︙ | |||
1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 | } /* * Create the object. */ oPtr = AllocObject(interp, simpleName, nsPtr, nsNameStr); oPtr->selfCls = classPtr; AddRef(classPtr->thisPtr); TclOOAddToInstances(oPtr, classPtr); /* * Check to see if we're really creating a class. If so, allocate the * class structure as well. | > > > | 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 | } /* * Create the object. */ oPtr = AllocObject(interp, simpleName, nsPtr, nsNameStr); if (oPtr == NULL) { return NULL; } oPtr->selfCls = classPtr; AddRef(classPtr->thisPtr); TclOOAddToInstances(oPtr, classPtr); /* * Check to see if we're really creating a class. If so, allocate the * class structure as well. |
︙ | ︙ | |||
1905 1906 1907 1908 1909 1910 1911 | static int FinalizeAlloc( void *data[], Tcl_Interp *interp, int result) { | | | | | | 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 | static int FinalizeAlloc( void *data[], Tcl_Interp *interp, int result) { CallContext *contextPtr = (CallContext *) data[0]; Object *oPtr = (Object *) data[1]; Tcl_InterpState state = (Tcl_InterpState) data[2]; Tcl_Object *objectPtr = (Tcl_Object *) data[3]; /* * Ensure an error if the object was deleted in the constructor. Don't * want to lose errors by accident. [Bug 2903011] */ if (result != TCL_ERROR && Destructing(oPtr)) { |
︙ | ︙ | |||
2129 2130 2131 2132 2133 2134 2135 | */ FOREACH(superPtr, cls2Ptr->superclasses) { TclOORemoveFromSubclasses(cls2Ptr, superPtr); TclOODecrRefCount(superPtr->thisPtr); } if (cls2Ptr->superclasses.num) { | | > | | | | 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 | */ FOREACH(superPtr, cls2Ptr->superclasses) { TclOORemoveFromSubclasses(cls2Ptr, superPtr); TclOODecrRefCount(superPtr->thisPtr); } if (cls2Ptr->superclasses.num) { cls2Ptr->superclasses.list = (Class **) Tcl_Realloc(cls2Ptr->superclasses.list, sizeof(Class *) * clsPtr->superclasses.num); } else { cls2Ptr->superclasses.list = (Class **) Tcl_Alloc(sizeof(Class *) * clsPtr->superclasses.num); } memcpy(cls2Ptr->superclasses.list, clsPtr->superclasses.list, sizeof(Class *) * clsPtr->superclasses.num); cls2Ptr->superclasses.num = clsPtr->superclasses.num; FOREACH(superPtr, cls2Ptr->superclasses) { TclOOAddToSubclasses(cls2Ptr, superPtr); |
︙ | ︙ | |||
2327 2328 2329 2330 2331 2332 2333 | Method *mPtr, Tcl_Obj *namePtr, Method **m2PtrPtr) { Method *m2Ptr; if (mPtr->typePtr == NULL) { | | | | | 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 | Method *mPtr, Tcl_Obj *namePtr, Method **m2PtrPtr) { Method *m2Ptr; if (mPtr->typePtr == NULL) { m2Ptr = (Method *) TclNewMethod((Tcl_Class) clsPtr, namePtr, mPtr->flags & PUBLIC_METHOD, NULL, NULL); } else if (mPtr->typePtr->cloneProc) { void *newClientData; if (mPtr->typePtr->cloneProc(interp, mPtr->clientData, &newClientData) != TCL_OK) { return TCL_ERROR; } m2Ptr = (Method *) TclNewMethod((Tcl_Class) clsPtr, namePtr, mPtr->flags & PUBLIC_METHOD, mPtr->typePtr, newClientData); } else { m2Ptr = (Method *) TclNewMethod((Tcl_Class) clsPtr, namePtr, mPtr->flags & PUBLIC_METHOD, mPtr->typePtr, mPtr->clientData); } if (m2PtrPtr != NULL) { *m2PtrPtr = m2Ptr; } return TCL_OK; |
︙ | ︙ | |||
2427 2428 2429 2430 2431 2432 2433 | * Attach the metadata store if not done already. */ if (clsPtr->metadataPtr == NULL) { if (metadata == NULL) { return; } | | > | 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 | * Attach the metadata store if not done already. */ if (clsPtr->metadataPtr == NULL) { if (metadata == NULL) { return; } clsPtr->metadataPtr = (Tcl_HashTable *) Tcl_Alloc(sizeof(Tcl_HashTable)); Tcl_InitHashTable(clsPtr->metadataPtr, TCL_ONE_WORD_KEYS); } /* * If the metadata is NULL, we're deleting the metadata for the type. */ |
︙ | ︙ | |||
2507 2508 2509 2510 2511 2512 2513 | * Attach the metadata store if not done already. */ if (oPtr->metadataPtr == NULL) { if (metadata == NULL) { return; } | | | 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 | * Attach the metadata store if not done already. */ if (oPtr->metadataPtr == NULL) { if (metadata == NULL) { return; } oPtr->metadataPtr = (Tcl_HashTable *) Tcl_Alloc(sizeof(Tcl_HashTable)); Tcl_InitHashTable(oPtr->metadataPtr, TCL_ONE_WORD_KEYS); } /* * If the metadata is NULL, we're deleting the metadata for the type. */ |
︙ | ︙ | |||
2556 2557 2558 2559 2560 2561 2562 | int TclOOPublicObjectCmd( void *clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const *objv) { | | | | | | | | 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 | int TclOOPublicObjectCmd( void *clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const *objv) { return Tcl_NRCallObjProc(interp, PublicNRObjectCmd, clientData, objc, objv); } static int PublicNRObjectCmd( void *clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const *objv) { return TclOOObjectCmdCore((Object *) clientData, interp, objc, objv, PUBLIC_METHOD, NULL); } int TclOOPrivateObjectCmd( void *clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const *objv) { return Tcl_NRCallObjProc(interp, PrivateNRObjectCmd, clientData, objc, objv); } static int PrivateNRObjectCmd( void *clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const *objv) { return TclOOObjectCmdCore((Object *) clientData, interp, objc, objv, 0, NULL); } int TclOOInvokeObject( Tcl_Interp *interp, /* Interpreter for commands, variables, * results, error reporting, etc. */ Tcl_Object object, /* The object to invoke. */ Tcl_Class startCls, /* Where in the class chain to start the * invoke from, or NULL to traverse the whole * chain including filters. */ int publicPrivate, /* Whether this is an invoke from a public * context (PUBLIC_METHOD), a private context * (PRIVATE_METHOD), or a *really* private * context (any other value; conventionally * 0). */ Tcl_Size objc, /* Number of arguments. */ Tcl_Obj *const *objv) /* Array of argument objects. It is assumed * that the name of the method to invoke will * be at index 1. */ { switch (publicPrivate) { case PUBLIC_METHOD: return TclOOObjectCmdCore((Object *) object, interp, objc, objv, |
︙ | ︙ | |||
2648 2649 2650 2651 2652 2653 2654 | static int MyClassNRObjCmd( void *clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const *objv) { | | | 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 | static int MyClassNRObjCmd( void *clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const *objv) { Object *oPtr = (Object *) clientData; if (objc < 2) { Tcl_WrongNumArgs(interp, 1, objv, "methodName ?arg ...?"); return TCL_ERROR; } return TclOOObjectCmdCore(oPtr->selfCls->thisPtr, interp, objc, objv, 0, NULL); |
︙ | ︙ | |||
2674 2675 2676 2677 2678 2679 2680 | * ---------------------------------------------------------------------- */ int TclOOObjectCmdCore( Object *oPtr, /* The object being invoked. */ Tcl_Interp *interp, /* The interpreter containing the object. */ | | | 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 | * ---------------------------------------------------------------------- */ int TclOOObjectCmdCore( Object *oPtr, /* The object being invoked. */ Tcl_Interp *interp, /* The interpreter containing the object. */ Tcl_Size objc, /* How many arguments are being passed in. */ Tcl_Obj *const *objv, /* The array of arguments. */ int flags, /* Whether this is an invocation through the * public or the private command interface. */ Class *startCls) /* Where to start in the call chain, or NULL * if we are to start at the front with * filters and the object's methods (which is * the normal case). */ |
︙ | ︙ | |||
2707 2708 2709 2710 2711 2712 2713 | /* * Determine if we're in a context that can see the extra, private methods * in this class. */ if (framePtr->isProcCallFrame & FRAME_IS_METHOD) { | | | 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 | /* * Determine if we're in a context that can see the extra, private methods * in this class. */ if (framePtr->isProcCallFrame & FRAME_IS_METHOD) { CallContext *callerContextPtr = (CallContext *) framePtr->clientData; Method *callerMethodPtr = callerContextPtr->callPtr->chain[callerContextPtr->index].mPtr; if (callerMethodPtr->declaringObjectPtr) { callerObjPtr = callerMethodPtr->declaringObjectPtr; } if (callerMethodPtr->declaringClassPtr) { |
︙ | ︙ | |||
2784 2785 2786 2787 2788 2789 2790 | * Check to see if we need to apply magical tricks to start part way * through the call chain. */ if (startCls != NULL) { for (; contextPtr->index < contextPtr->callPtr->numChain; contextPtr->index++) { | < | | 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 | * Check to see if we need to apply magical tricks to start part way * through the call chain. */ if (startCls != NULL) { for (; contextPtr->index < contextPtr->callPtr->numChain; contextPtr->index++) { MInvoke *miPtr = &contextPtr->callPtr->chain[contextPtr->index]; if (miPtr->isFilter) { continue; } if (miPtr->mPtr->declaringClassPtr == startCls) { break; } |
︙ | ︙ | |||
2824 2825 2826 2827 2828 2829 2830 | int result) { /* * Dispose of the call chain, which drops the lock on the object's * structure. */ | | | 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 | int result) { /* * Dispose of the call chain, which drops the lock on the object's * structure. */ TclOODeleteContext((CallContext *) data[0]); return result; } /* * ---------------------------------------------------------------------- * * Tcl_ObjectContextInvokeNext, TclNRObjectContextInvokeNext, FinalizeNext -- |
︙ | ︙ | |||
2980 2981 2982 2983 2984 2985 2986 | static int FinalizeNext( void *data[], TCL_UNUSED(Tcl_Interp *), int result) { | | | 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 | static int FinalizeNext( void *data[], TCL_UNUSED(Tcl_Interp *), int result) { CallContext *contextPtr = (CallContext *) data[0]; /* * Restore the call chain context index as we've finished the inner invoke * and want to operate in the outer context again. */ contextPtr->index = PTR2INT(data[1]); |
︙ | ︙ | |||
3021 3022 3023 3024 3025 3026 3027 | } if (cmdPtr->objProc != TclOOPublicObjectCmd) { cmdPtr = (Command *) TclGetOriginalCommand((Tcl_Command) cmdPtr); if (cmdPtr == NULL || cmdPtr->objProc != TclOOPublicObjectCmd) { goto notAnObject; } } | | | 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 | } if (cmdPtr->objProc != TclOOPublicObjectCmd) { cmdPtr = (Command *) TclGetOriginalCommand((Tcl_Command) cmdPtr); if (cmdPtr == NULL || cmdPtr->objProc != TclOOPublicObjectCmd) { goto notAnObject; } } return (Tcl_Object) cmdPtr->objClientData; notAnObject: Tcl_SetObjResult(interp, Tcl_ObjPrintf( "%s does not refer to an object", TclGetString(objPtr))); Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "OBJECT", TclGetString(objPtr), (char *)NULL); return NULL; |
︙ | ︙ | |||
3137 3138 3139 3140 3141 3142 3143 | return contextPtr->callPtr->chain[contextPtr->index].isFilter; } Tcl_Object Tcl_ObjectContextObject( Tcl_ObjectContext context) { | | | | | | | | | 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 | return contextPtr->callPtr->chain[contextPtr->index].isFilter; } Tcl_Object Tcl_ObjectContextObject( Tcl_ObjectContext context) { return (Tcl_Object) ((CallContext *) context)->oPtr; } Tcl_Size Tcl_ObjectContextSkippedArgs( Tcl_ObjectContext context) { return ((CallContext *) context)->skip; } Tcl_Namespace * Tcl_GetObjectNamespace( Tcl_Object object) { return ((Object *) object)->namespacePtr; } Tcl_Command Tcl_GetObjectCommand( Tcl_Object object) { return ((Object *) object)->command; } Tcl_Class Tcl_GetObjectAsClass( Tcl_Object object) { return (Tcl_Class) ((Object *) object)->classPtr; } int Tcl_ObjectDeleted( Tcl_Object object) { return ((Object *) object)->command == NULL; } Tcl_Object Tcl_GetClassAsObject( Tcl_Class clazz) { return (Tcl_Object) ((Class *) clazz)->thisPtr; } Tcl_ObjectMapMethodNameProc * Tcl_ObjectGetMethodNameMapper( Tcl_Object object) { return ((Object *) object)->mapMethodNameProc; |
︙ | ︙ |
Changes to generic/tclOO.h.
︙ | ︙ | |||
77 78 79 80 81 82 83 | /* * The type of a method implementation. This describes how to call the method * implementation, how to delete it (when the object or class is deleted) and * how to create a clone of it (when the object or class is copied). */ | | | | 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | /* * The type of a method implementation. This describes how to call the method * implementation, how to delete it (when the object or class is deleted) and * how to create a clone of it (when the object or class is copied). */ typedef struct Tcl_MethodType { int version; /* Structure version field. Always to be equal * to TCL_OO_METHOD_VERSION_(1|CURRENT) in * declarations. */ const char *name; /* Name of this type of method, mostly for * debugging purposes. */ Tcl_MethodCallProc *callProc; /* How to invoke this method. */ Tcl_MethodDeleteProc *deleteProc; /* How to delete this method's type-specific * data, or NULL if the type-specific data * does not need deleting. */ Tcl_CloneProc *cloneProc; /* How to copy this method's type-specific * data, or NULL if the type-specific data can * be copied directly. */ } Tcl_MethodType; #if TCL_MAJOR_VERSION > 8 typedef struct Tcl_MethodType2 { int version; /* Structure version field. Always to be equal * to TCL_OO_METHOD_VERSION_2 in * declarations. */ const char *name; /* Name of this type of method, mostly for * debugging purposes. */ Tcl_MethodCallProc2 *callProc; /* How to invoke this method. */ |
︙ | ︙ | |||
120 121 122 123 124 125 126 | #endif /* * The correct value for the version field of the Tcl_MethodType structure. * This allows new versions of the structure to be introduced without breaking * binary compatibility. */ | | | | > | | | | | > | > > > | | 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 | #endif /* * The correct value for the version field of the Tcl_MethodType structure. * This allows new versions of the structure to be introduced without breaking * binary compatibility. */ enum TclOOMethodVersion { TCL_OO_METHOD_VERSION_1 = 1, TCL_OO_METHOD_VERSION_2 = 2 }; #define TCL_OO_METHOD_VERSION_CURRENT TCL_OO_METHOD_VERSION_1 /* * Visibility constants for the flags parameter to Tcl_NewMethod and * Tcl_NewInstanceMethod. */ enum TclOOMethodVisibilityFlags { TCL_OO_METHOD_PUBLIC = 1, TCL_OO_METHOD_UNEXPORTED = 0, TCL_OO_METHOD_PRIVATE = 0x20 }; /* * The type of some object (or class) metadata. This describes how to delete * the metadata (when the object or class is deleted) and how to create a * clone of it (when the object or class is copied). */ typedef struct Tcl_ObjectMetadataType { int version; /* Structure version field. Always to be equal * to TCL_OO_METADATA_VERSION_CURRENT in * declarations. */ const char *name; Tcl_ObjectMetadataDeleteProc *deleteProc; /* How to delete the metadata. This must not * be NULL. */ Tcl_CloneProc *cloneProc; /* How to copy the metadata, or NULL if the * type-specific data can be copied * directly. */ } Tcl_ObjectMetadataType; /* * The correct value for the version field of the Tcl_ObjectMetadataType * structure. This allows new versions of the structure to be introduced * without breaking binary compatibility. */ enum TclOOMetadataVersion { TCL_OO_METADATA_VERSION_1 = 1 }; #define TCL_OO_METADATA_VERSION_CURRENT TCL_OO_METADATA_VERSION_1 /* * Include all the public API, generated from tclOO.decls. */ #include "tclOODecls.h" |
︙ | ︙ |
Changes to generic/tclOOBasic.c.
︙ | ︙ | |||
52 53 54 55 56 57 58 | static int FinalizeConstruction( void *data[], Tcl_Interp *interp, int result) { | | | 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | static int FinalizeConstruction( void *data[], Tcl_Interp *interp, int result) { Object *oPtr = (Object *) data[0]; if (result != TCL_OK) { return result; } Tcl_SetObjResult(interp, TclOOObjectName(interp, oPtr)); return TCL_OK; } |
︙ | ︙ | |||
83 84 85 86 87 88 89 | int objc, Tcl_Obj *const *objv) { Object *oPtr = (Object *) Tcl_ObjectContextObject(context); Tcl_Obj **invoke, *nameObj; size_t skip = Tcl_ObjectContextSkippedArgs(context); | | < < > > > > | < | > > > > > > > > | | 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | int objc, Tcl_Obj *const *objv) { Object *oPtr = (Object *) Tcl_ObjectContextObject(context); Tcl_Obj **invoke, *nameObj; size_t skip = Tcl_ObjectContextSkippedArgs(context); if ((size_t) objc > skip + 1) { Tcl_WrongNumArgs(interp, skip, objv, "?definitionScript?"); return TCL_ERROR; } /* * Make the class definition delegate. This is special; it doesn't reenter * here (and the class definition delegate doesn't run any constructors). * * This needs to be done before consideration of whether to pass the script * argument to [oo::define]. [Bug 680503] */ nameObj = Tcl_ObjPrintf("%s:: oo ::delegate", oPtr->namespacePtr->fullName); Tcl_NewObjectInstance(interp, (Tcl_Class) oPtr->fPtr->classCls, TclGetString(nameObj), NULL, -1, NULL, -1); Tcl_BounceRefCount(nameObj); /* * If there's nothing else to do, we're done. */ if ((size_t) objc == skip) { return TCL_OK; } /* * Delegate to [oo::define] to do the work. */ invoke = (Tcl_Obj **) TclStackAlloc(interp, 3 * sizeof(Tcl_Obj *)); invoke[0] = oPtr->fPtr->defineName; invoke[1] = TclOOObjectName(interp, oPtr); invoke[2] = objv[objc-1]; /* * Must add references or errors in configuration script will cause * trouble. |
︙ | ︙ | |||
136 137 138 139 140 141 142 | static int DecrRefsPostClassConstructor( void *data[], Tcl_Interp *interp, int result) { | | | | | 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 | static int DecrRefsPostClassConstructor( void *data[], Tcl_Interp *interp, int result) { Tcl_Obj **invoke = (Tcl_Obj **) data[0]; Object *oPtr = (Object *) data[1]; Tcl_InterpState saved; int code; TclDecrRefCount(invoke[0]); TclDecrRefCount(invoke[1]); TclDecrRefCount(invoke[2]); invoke[0] = Tcl_NewStringObj("::oo::MixinClassDelegates", -1); invoke[1] = TclOOObjectName(interp, oPtr); Tcl_IncrRefCount(invoke[0]); Tcl_IncrRefCount(invoke[1]); saved = Tcl_SaveInterpState(interp, result); code = Tcl_EvalObjv(interp, 2, invoke, 0); TclDecrRefCount(invoke[0]); TclDecrRefCount(invoke[1]); TclStackFree(interp, invoke); if (code != TCL_OK) { Tcl_DiscardInterpState(saved); return code; } return Tcl_RestoreInterpState(interp, saved); } |
︙ | ︙ | |||
364 365 366 367 368 369 370 | Tcl_ObjectContext context, /* The object/call context. */ int objc, /* Number of arguments. */ Tcl_Obj *const *objv) /* The actual arguments. */ { Object *oPtr = (Object *) Tcl_ObjectContextObject(context); CallContext *contextPtr; | | | 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 | Tcl_ObjectContext context, /* The object/call context. */ int objc, /* Number of arguments. */ Tcl_Obj *const *objv) /* The actual arguments. */ { Object *oPtr = (Object *) Tcl_ObjectContextObject(context); CallContext *contextPtr; if (objc != (int) Tcl_ObjectContextSkippedArgs(context)) { Tcl_WrongNumArgs(interp, Tcl_ObjectContextSkippedArgs(context), objv, NULL); return TCL_ERROR; } if (!(oPtr->flags & DESTRUCTOR_CALLED)) { oPtr->flags |= DESTRUCTOR_CALLED; contextPtr = TclOOGetCallContext(oPtr, NULL, DESTRUCTOR, NULL, NULL, |
︙ | ︙ | |||
394 395 396 397 398 399 400 | static int AfterNRDestructor( void *data[], Tcl_Interp *interp, int result) { | | | 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 | static int AfterNRDestructor( void *data[], Tcl_Interp *interp, int result) { CallContext *contextPtr = (CallContext *) data[0]; if (contextPtr->oPtr->command) { Tcl_DeleteCommandFromToken(interp, contextPtr->oPtr->command); } TclOODeleteContext(contextPtr); return result; } |
︙ | ︙ | |||
429 430 431 432 433 434 435 | CallContext *contextPtr = (CallContext *) context; Tcl_Object object = Tcl_ObjectContextObject(context); size_t skip = Tcl_ObjectContextSkippedArgs(context); CallFrame *framePtr, **framePtrPtr = &framePtr; Tcl_Obj *scriptPtr; CmdFrame *invoker; | | | > | | 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 | CallContext *contextPtr = (CallContext *) context; Tcl_Object object = Tcl_ObjectContextObject(context); size_t skip = Tcl_ObjectContextSkippedArgs(context); CallFrame *framePtr, **framePtrPtr = &framePtr; Tcl_Obj *scriptPtr; CmdFrame *invoker; if ((size_t) objc < skip + 1) { Tcl_WrongNumArgs(interp, skip, objv, "arg ?arg ...?"); return TCL_ERROR; } /* * Make the object's namespace the current namespace and evaluate the * command(s). */ (void) TclPushStackFrame(interp, (Tcl_CallFrame **) framePtrPtr, Tcl_GetObjectNamespace(object), FRAME_IS_METHOD); framePtr->clientData = context; framePtr->objc = objc; framePtr->objv = objv; /* Reference counts do not need to be * incremented here. */ if (!(contextPtr->callPtr->flags & PUBLIC_METHOD)) { object = NULL; /* Now just for error mesage printing. */ } /* * Work out what script we are actually going to evaluate. * * When there's more than one argument, we concatenate them together with * spaces between, then evaluate the result. Tcl_EvalObjEx will delete the * object when it decrements its refcount after eval'ing it. */ if ((size_t) objc != skip+1) { scriptPtr = Tcl_ConcatObj(objc-skip, objv+skip); invoker = NULL; } else { scriptPtr = objv[skip]; invoker = ((Interp *) interp)->cmdFramePtr; } |
︙ | ︙ | |||
481 482 483 484 485 486 487 | static int FinalizeEval( void *data[], Tcl_Interp *interp, int result) { if (result == TCL_ERROR) { | | | 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 | static int FinalizeEval( void *data[], Tcl_Interp *interp, int result) { if (result == TCL_ERROR) { Object *oPtr = (Object *) data[0]; const char *namePtr; if (oPtr) { namePtr = TclGetString(TclOOObjectName(interp, oPtr)); } else { namePtr = "my"; } |
︙ | ︙ | |||
539 540 541 542 543 544 545 | /* * If no method name, generate an error asking for a method name. (Only by * overriding *this* method can an object handle the absence of a method * name without an error). */ | | | | 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 | /* * If no method name, generate an error asking for a method name. (Only by * overriding *this* method can an object handle the absence of a method * name without an error). */ if ((size_t) objc < skip + 1) { Tcl_WrongNumArgs(interp, skip, objv, "method ?arg ...?"); return TCL_ERROR; } /* * Determine if the calling context should know about extra private * methods, and if so, which. */ if (framePtr->isProcCallFrame & FRAME_IS_METHOD) { CallContext *callerContext = (CallContext *) framePtr->clientData; Method *mPtr = callerContext->callPtr->chain[ callerContext->index].mPtr; if (mPtr->declaringObjectPtr) { if (oPtr == mPtr->declaringObjectPtr) { callerObj = mPtr->declaringObjectPtr; } |
︙ | ︙ | |||
604 605 606 607 608 609 610 | } Tcl_AppendToObj(errorMsg, methodNames[i], -1); } if (i) { Tcl_AppendToObj(errorMsg, " or ", -1); } Tcl_AppendToObj(errorMsg, methodNames[i], -1); | | | 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 | } Tcl_AppendToObj(errorMsg, methodNames[i], -1); } if (i) { Tcl_AppendToObj(errorMsg, " or ", -1); } Tcl_AppendToObj(errorMsg, methodNames[i], -1); Tcl_Free((void *) methodNames); Tcl_SetObjResult(interp, errorMsg); Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "METHOD", TclGetString(objv[skip]), (char *)NULL); return TCL_ERROR; } /* |
︙ | ︙ | |||
716 717 718 719 720 721 722 | } return TCL_OK; } /* * ---------------------------------------------------------------------- * | | | > > > | < | < | < | | > > > | < < < | < < < | < < < < | | | | | | | | | | | | | | | | > | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | < < < < < | < | < | | 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 | } return TCL_OK; } /* * ---------------------------------------------------------------------- * * TclOOLookupObjectVar -- * * Look up a variable in an object. Tricky because of private variables. * * Returns: * Handle to the variable if it can be found, or NULL if there's an error. * * ---------------------------------------------------------------------- */ Tcl_Var TclOOLookupObjectVar( Tcl_Interp *interp, Tcl_Object object, /* Object we're looking up within. */ Tcl_Obj *varName, /* User-visible name we're looking up. */ Tcl_Var *aryPtr) /* Where to write the handle to the array * containing the element; if not an element, * then the variable this points to is set to * NULL. */ { const char *arg = TclGetString(varName); Tcl_Obj *varNamePtr; /* * Convert the variable name to fully-qualified form if it wasn't already. * This has to be done prior to lookup because we can run into problems * with resolvers otherwise. [Bug 3603695] * * We still need to do the lookup; the variable could be linked to another * variable and we want the target's name. */ if (arg[0] == ':' && arg[1] == ':') { varNamePtr = varName; } else { Tcl_Namespace *namespacePtr = Tcl_GetObjectNamespace(object); CallFrame *framePtr = ((Interp *) interp)->varFramePtr; /* * Private method handling. [TIP 500] * * If we're in a context that can see some private methods of an * object, we may need to precede a variable name with its prefix. * This is a little tricky as we need to check through the inheritance * hierarchy when the method was declared by a class to see if the * current object is an instance of that class. */ if (framePtr->isProcCallFrame & FRAME_IS_METHOD) { Object *oPtr = (Object *) object; CallContext *callerContext = (CallContext *) framePtr->clientData; Method *mPtr = callerContext->callPtr->chain[ callerContext->index].mPtr; PrivateVariableMapping *pvPtr; Tcl_Size i; if (mPtr->declaringObjectPtr == oPtr) { FOREACH_STRUCT(pvPtr, oPtr->privateVariables) { if (!TclStringCmp(pvPtr->variableObj, varName, 1, 0, TCL_INDEX_NONE)) { varName = pvPtr->fullNameObj; break; } } } else if (mPtr->declaringClassPtr && mPtr->declaringClassPtr->privateVariables.num) { Class *clsPtr = mPtr->declaringClassPtr; int isInstance = TclOOIsReachable(clsPtr, oPtr->selfCls); Class *mixinCls; if (!isInstance) { FOREACH(mixinCls, oPtr->mixins) { if (TclOOIsReachable(clsPtr, mixinCls)) { isInstance = 1; break; } } } if (isInstance) { FOREACH_STRUCT(pvPtr, clsPtr->privateVariables) { if (!TclStringCmp(pvPtr->variableObj, varName, 1, 0, TCL_INDEX_NONE)) { varName = pvPtr->fullNameObj; break; } } } } } // The namespace isn't the global one; necessarily true for any object! varNamePtr = Tcl_ObjPrintf("%s::%s", namespacePtr->fullName, TclGetString(varName)); } Tcl_IncrRefCount(varNamePtr); Tcl_Var var = (Tcl_Var) TclObjLookupVar(interp, varNamePtr, NULL, TCL_NAMESPACE_ONLY|TCL_LEAVE_ERR_MSG, "refer to", 1, 1, (Var **) aryPtr); Tcl_DecrRefCount(varNamePtr); if (var == NULL) { Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "VARIABLE", arg, (void *) NULL); } else if (*aryPtr == NULL && TclIsVarArrayElement((Var *) var)) { /* * If the varPtr points to an element of an array but we don't already * have the array, find it now. Note that this can't be easily * backported; the arrayPtr field is new in Tcl 9.0. [Bug 2da1cb0c80] */ *aryPtr = (Tcl_Var) TclVarParentArray(var); } return var; } /* * ---------------------------------------------------------------------- * * TclOO_Object_VarName -- * * Implementation of the oo::object->varname method. * * ---------------------------------------------------------------------- */ int TclOO_Object_VarName( TCL_UNUSED(void *), Tcl_Interp *interp, /* Interpreter in which to create the object; * also used for error reporting. */ Tcl_ObjectContext context, /* The object/call context. */ int objc, /* Number of arguments. */ Tcl_Obj *const *objv) /* The actual arguments. */ { Tcl_Var varPtr, aryVar; Tcl_Obj *varNamePtr; if ((int) Tcl_ObjectContextSkippedArgs(context) + 1 != objc) { Tcl_WrongNumArgs(interp, Tcl_ObjectContextSkippedArgs(context), objv, "varName"); return TCL_ERROR; } varPtr = TclOOLookupObjectVar(interp, Tcl_ObjectContextObject(context), objv[objc - 1], &aryVar); if (varPtr == NULL) { return TCL_ERROR; } /* * The variable reference must not disappear too soon. [Bug 74b6110204] */ if (!TclIsVarArrayElement((Var *) varPtr)) { TclSetVarNamespaceVar((Var *) varPtr); } /* * Now that we've pinned down what variable we're really talking about * (including traversing variable links), convert back to a name. */ TclNewObj(varNamePtr); if (aryVar != NULL) { Tcl_GetVariableFullName(interp, aryVar, varNamePtr); Tcl_AppendPrintfToObj(varNamePtr, "(%s)", Tcl_GetString( VarHashGetKey(varPtr))); } else { Tcl_GetVariableFullName(interp, varPtr, varNamePtr); } Tcl_SetObjResult(interp, varNamePtr); return TCL_OK; } /* * ---------------------------------------------------------------------- |
︙ | ︙ | |||
885 886 887 888 889 890 891 | if (framePtr == NULL || !(framePtr->isProcCallFrame & FRAME_IS_METHOD)) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "%s may only be called from inside a method", TclGetString(objv[0]))); Tcl_SetErrorCode(interp, "TCL", "OO", "CONTEXT_REQUIRED", (char *)NULL); return TCL_ERROR; } | | | 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 | if (framePtr == NULL || !(framePtr->isProcCallFrame & FRAME_IS_METHOD)) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "%s may only be called from inside a method", TclGetString(objv[0]))); Tcl_SetErrorCode(interp, "TCL", "OO", "CONTEXT_REQUIRED", (char *)NULL); return TCL_ERROR; } context = (Tcl_ObjectContext) framePtr->clientData; /* * Invoke the (advanced) method call context in the caller context. Note * that this is like [uplevel 1] and not [eval]. */ TclNRAddCallback(interp, NextRestoreFrame, framePtr, NULL,NULL,NULL); |
︙ | ︙ | |||
925 926 927 928 929 930 931 | if (framePtr == NULL || !(framePtr->isProcCallFrame & FRAME_IS_METHOD)) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "%s may only be called from inside a method", TclGetString(objv[0]))); Tcl_SetErrorCode(interp, "TCL", "OO", "CONTEXT_REQUIRED", (char *)NULL); return TCL_ERROR; } | | | | | 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 | if (framePtr == NULL || !(framePtr->isProcCallFrame & FRAME_IS_METHOD)) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "%s may only be called from inside a method", TclGetString(objv[0]))); Tcl_SetErrorCode(interp, "TCL", "OO", "CONTEXT_REQUIRED", (char *)NULL); return TCL_ERROR; } contextPtr = (CallContext *) framePtr->clientData; /* * Sanity check the arguments; we need the first one to refer to a class. */ if (objc < 2) { Tcl_WrongNumArgs(interp, 1, objv, "class ?arg...?"); return TCL_ERROR; } object = Tcl_GetObjectFromObj(interp, objv[1]); if (object == NULL) { return TCL_ERROR; } classPtr = ((Object *) object)->classPtr; if (classPtr == NULL) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "\"%s\" is not a class", TclGetString(objv[1]))); Tcl_SetErrorCode(interp, "TCL", "OO", "CLASS_REQUIRED", (char *)NULL); return TCL_ERROR; } /* * Search for an implementation of a method associated with the current * call on the call chain past the point where we currently are. Do not * allow jumping backwards! */ for (i=contextPtr->index+1 ; i<contextPtr->callPtr->numChain ; i++) { MInvoke *miPtr = &contextPtr->callPtr->chain[i]; if (!miPtr->isFilter && miPtr->mPtr->declaringClassPtr == classPtr) { /* * Invoke the (advanced) method call context in the caller * context. Note that this is like [uplevel 1] and not [eval]. */ |
︙ | ︙ | |||
985 986 987 988 989 990 991 | } else if (contextPtr->callPtr->flags & DESTRUCTOR) { methodType = "destructor"; } else { methodType = "method"; } for (i=contextPtr->index ; i != TCL_INDEX_NONE ; i--) { | | | 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 | } else if (contextPtr->callPtr->flags & DESTRUCTOR) { methodType = "destructor"; } else { methodType = "method"; } for (i=contextPtr->index ; i != TCL_INDEX_NONE ; i--) { MInvoke *miPtr = &contextPtr->callPtr->chain[i]; if (!miPtr->isFilter && miPtr->mPtr->declaringClassPtr == classPtr) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "%s implementation by \"%s\" not reachable from here", methodType, TclGetString(objv[1]))); Tcl_SetErrorCode(interp, "TCL", "OO", "CLASS_NOT_REACHABLE", (char *)NULL); |
︙ | ︙ | |||
1010 1011 1012 1013 1014 1015 1016 | static int NextRestoreFrame( void *data[], Tcl_Interp *interp, int result) { Interp *iPtr = (Interp *) interp; | | | | 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 | static int NextRestoreFrame( void *data[], Tcl_Interp *interp, int result) { Interp *iPtr = (Interp *) interp; CallContext *contextPtr = (CallContext *) data[1]; iPtr->varFramePtr = (CallFrame *) data[0]; if (contextPtr != NULL) { contextPtr->index = PTR2UINT(data[2]); } return result; } /* |
︙ | ︙ | |||
1065 1066 1067 1068 1069 1070 1071 | Tcl_SetObjResult(interp, Tcl_ObjPrintf( "%s may only be called from inside a method", TclGetString(objv[0]))); Tcl_SetErrorCode(interp, "TCL", "OO", "CONTEXT_REQUIRED", (char *)NULL); return TCL_ERROR; } | | | 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 | Tcl_SetObjResult(interp, Tcl_ObjPrintf( "%s may only be called from inside a method", TclGetString(objv[0]))); Tcl_SetErrorCode(interp, "TCL", "OO", "CONTEXT_REQUIRED", (char *)NULL); return TCL_ERROR; } contextPtr = (CallContext *) framePtr->clientData; /* * Now we do "conventional" argument parsing for a while. Note that no * subcommand takes arguments. */ if (objc > 2) { |
︙ | ︙ | |||
1087 1088 1089 1090 1091 1092 1093 | } switch (index) { case SELF_OBJECT: Tcl_SetObjResult(interp, TclOOObjectName(interp, contextPtr->oPtr)); return TCL_OK; case SELF_NS: | | | | 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 | } switch (index) { case SELF_OBJECT: Tcl_SetObjResult(interp, TclOOObjectName(interp, contextPtr->oPtr)); return TCL_OK; case SELF_NS: Tcl_SetObjResult(interp, TclNewNamespaceObj(contextPtr->oPtr->namespacePtr)); return TCL_OK; case SELF_CLASS: { Class *clsPtr = CurrentlyInvoked(contextPtr).mPtr->declaringClassPtr; if (clsPtr == NULL) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "method not defined by a class", -1)); |
︙ | ︙ | |||
1120 1121 1122 1123 1124 1125 1126 | case SELF_FILTER: if (!CurrentlyInvoked(contextPtr).isFilter) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "not inside a filtering context", -1)); Tcl_SetErrorCode(interp, "TCL", "OO", "UNMATCHED_CONTEXT", (char *)NULL); return TCL_ERROR; } else { | | | 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 | case SELF_FILTER: if (!CurrentlyInvoked(contextPtr).isFilter) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "not inside a filtering context", -1)); Tcl_SetErrorCode(interp, "TCL", "OO", "UNMATCHED_CONTEXT", (char *)NULL); return TCL_ERROR; } else { MInvoke *miPtr = &CurrentlyInvoked(contextPtr); Object *oPtr; const char *type; if (miPtr->filterDeclarer != NULL) { oPtr = miPtr->filterDeclarer->thisPtr; type = "class"; } else { |
︙ | ︙ | |||
1146 1147 1148 1149 1150 1151 1152 | if ((framePtr->callerVarPtr == NULL) || !(framePtr->callerVarPtr->isProcCallFrame & FRAME_IS_METHOD)){ Tcl_SetObjResult(interp, Tcl_NewStringObj( "caller is not an object", -1)); Tcl_SetErrorCode(interp, "TCL", "OO", "CONTEXT_REQUIRED", (char *)NULL); return TCL_ERROR; } else { | | > | 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 | if ((framePtr->callerVarPtr == NULL) || !(framePtr->callerVarPtr->isProcCallFrame & FRAME_IS_METHOD)){ Tcl_SetObjResult(interp, Tcl_NewStringObj( "caller is not an object", -1)); Tcl_SetErrorCode(interp, "TCL", "OO", "CONTEXT_REQUIRED", (char *)NULL); return TCL_ERROR; } else { CallContext *callerPtr = (CallContext *) framePtr->callerVarPtr->clientData; Method *mPtr = callerPtr->callPtr->chain[callerPtr->index].mPtr; Object *declarerPtr; if (mPtr->declaringClassPtr != NULL) { declarerPtr = mPtr->declaringClassPtr->thisPtr; } else if (mPtr->declaringObjectPtr != NULL) { declarerPtr = mPtr->declaringObjectPtr; |
︙ | ︙ |
Changes to generic/tclOOCall.c.
︙ | ︙ | |||
15 16 17 18 19 20 21 | #include "config.h" #endif #include "tclInt.h" #include "tclOOInt.h" #include <assert.h> /* | | | < | | | | | | | | | | | | | | > > | 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | #include "config.h" #endif #include "tclInt.h" #include "tclOOInt.h" #include <assert.h> /* * Structure containing a CallChain and any other values needed only during * the construction of the CallChain. */ typedef struct ChainBuilder { CallChain *callChainPtr; /* The call chain being built. */ size_t filterLength; /* Number of entries in the call chain that * are due to processing filters and not the * main call chain. */ Object *oPtr; /* The object that we are building the chain * for. */ } ChainBuilder; /* * Structures used for traversing the class hierarchy to find out where * definitions are supposed to be done. */ typedef struct DefineEntry { Class *definerCls; Tcl_Obj *namespaceName; } DefineEntry; typedef struct DefineChain { DefineEntry *list; int num; int size; } DefineChain; /* * Extra flags used for call chain management. */ enum CallChainFlags { DEFINITE_PROTECTED = 0x100000, DEFINITE_PUBLIC = 0x200000, KNOWN_STATE = (DEFINITE_PROTECTED | DEFINITE_PUBLIC), SPECIAL = (CONSTRUCTOR | DESTRUCTOR | FORCE_UNKNOWN), BUILDING_MIXINS = 0x400000, TRAVERSED_MIXIN = 0x800000, OBJECT_MIXIN = 0x1000000, DEFINE_FOR_CLASS = 0x2000000 }; #define MIXIN_CONSISTENT(flags) \ (((flags) & OBJECT_MIXIN) || \ !((flags) & BUILDING_MIXINS) == !((flags) & TRAVERSED_MIXIN)) /* * Note that the flag bit PRIVATE_METHOD has a confusing name; it's just for * Itcl's special type of private. |
︙ | ︙ | |||
82 83 84 85 86 87 88 89 90 91 92 93 | #define WANT_UNEXPORTED(flags) \ (((flags) & (PRIVATE_METHOD | TRUE_PRIVATE_METHOD)) == 0) #define WANT_ITCLPRIVATE(flags) \ (((flags) & PRIVATE_METHOD) != 0) #define WANT_PRIVATE(flags) \ (((flags) & TRUE_PRIVATE_METHOD) != 0) /* * Function declarations for things defined in this file. */ static void AddClassFiltersToCallContext(Object *const oPtr, | > > > > > > > > | | | | | | | 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 | #define WANT_UNEXPORTED(flags) \ (((flags) & (PRIVATE_METHOD | TRUE_PRIVATE_METHOD)) == 0) #define WANT_ITCLPRIVATE(flags) \ (((flags) & PRIVATE_METHOD) != 0) #define WANT_PRIVATE(flags) \ (((flags) & TRUE_PRIVATE_METHOD) != 0) /* * Name the bits used in the names table values. */ enum NameTableValues { IN_LIST = 1, /* Seen an implementation. */ NO_IMPLEMENTATION = 2 /* Seen, but not implemented yet. */ }; /* * Function declarations for things defined in this file. */ static void AddClassFiltersToCallContext(Object *const oPtr, Class *clsPtr, ChainBuilder *const cbPtr, Tcl_HashTable *const doneFilters, int flags); static void AddClassMethodNames(Class *clsPtr, int flags, Tcl_HashTable *const namesPtr, Tcl_HashTable *const examinedClassesPtr); static inline void AddDefinitionNamespaceToChain(Class *const definerCls, Tcl_Obj *const namespaceName, DefineChain *const definePtr, int flags); static inline void AddMethodToCallChain(Method *const mPtr, ChainBuilder *const cbPtr, Tcl_HashTable *const doneFilters, Class *const filterDecl, int flags); static inline int AddInstancePrivateToCallContext(Object *const oPtr, Tcl_Obj *const methodNameObj, ChainBuilder *const cbPtr, int flags); static inline void AddStandardMethodName(int flags, Tcl_Obj *namePtr, Method *mPtr, Tcl_HashTable *namesPtr); static inline void AddPrivateMethodNames(Tcl_HashTable *methodsTablePtr, Tcl_HashTable *namesPtr); static inline int AddSimpleChainToCallContext(Object *const oPtr, Class *const contextCls, Tcl_Obj *const methodNameObj, ChainBuilder *const cbPtr, Tcl_HashTable *const doneFilters, int flags, Class *const filterDecl); static int AddPrivatesFromClassChainToCallContext(Class *classPtr, Class *const contextCls, Tcl_Obj *const methodNameObj, ChainBuilder *const cbPtr, Tcl_HashTable *const doneFilters, int flags, Class *const filterDecl); static int AddSimpleClassChainToCallContext(Class *classPtr, Tcl_Obj *const methodNameObj, ChainBuilder *const cbPtr, Tcl_HashTable *const doneFilters, int flags, Class *const filterDecl); static void AddSimpleClassDefineNamespaces(Class *classPtr, DefineChain *const definePtr, int flags); static inline void AddSimpleDefineNamespaces(Object *const oPtr, DefineChain *const definePtr, int flags); static int CmpStr(const void *ptr1, const void *ptr2); |
︙ | ︙ | |||
277 278 279 280 281 282 283 | */ static void DupMethodNameRep( Tcl_Obj *srcPtr, Tcl_Obj *dstPtr) { | | | | | | | | 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 | */ static void DupMethodNameRep( Tcl_Obj *srcPtr, Tcl_Obj *dstPtr) { StashCallChain(dstPtr, (CallChain *) TclFetchInternalRep(srcPtr, &methodNameType)->twoPtrValue.ptr1); } static void FreeMethodNameRep( Tcl_Obj *objPtr) { TclOODeleteChain((CallChain *) TclFetchInternalRep(objPtr, &methodNameType)->twoPtrValue.ptr1); } /* * ---------------------------------------------------------------------- * * TclOOInvokeContext -- * * Invokes a single step along a method call-chain context. Note that the * invocation of a step along the chain can cause further steps along the * chain to be invoked. Note that this function is written to be as light * in stack usage as possible. * * ---------------------------------------------------------------------- */ int TclOOInvokeContext( void *clientData, /* The method call context. */ Tcl_Interp *interp, /* Interpreter for error reporting, and many * other sorts of context handling (e.g., * commands, variables) depending on method * implementation. */ int objc, /* The number of arguments. */ Tcl_Obj *const objv[]) /* The arguments as actually seen. */ { CallContext *const contextPtr = (CallContext *) clientData; Method *const mPtr = contextPtr->callPtr->chain[contextPtr->index].mPtr; const int isFilter = contextPtr->callPtr->chain[contextPtr->index].isFilter; /* * If this is the first step along the chain, we preserve the method * entries in the chain so that they do not get deleted out from under our |
︙ | ︙ | |||
371 372 373 374 375 376 377 | * Run the method implementation. */ if (mPtr->typePtr->version < TCL_OO_METHOD_VERSION_2) { return (mPtr->typePtr->callProc)(mPtr->clientData, interp, (Tcl_ObjectContext) contextPtr, objc, objv); } | | | | | | 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 | * Run the method implementation. */ if (mPtr->typePtr->version < TCL_OO_METHOD_VERSION_2) { return (mPtr->typePtr->callProc)(mPtr->clientData, interp, (Tcl_ObjectContext) contextPtr, objc, objv); } return (mPtr->type2Ptr->callProc)(mPtr->clientData, interp, (Tcl_ObjectContext) contextPtr, objc, objv); } static int SetFilterFlags( void *data[], TCL_UNUSED(Tcl_Interp *), int result) { CallContext *contextPtr = (CallContext *) data[0]; contextPtr->oPtr->flags |= FILTER_HANDLING; return result; } static int ResetFilterFlags( void *data[], TCL_UNUSED(Tcl_Interp *), int result) { CallContext *contextPtr = (CallContext *) data[0]; contextPtr->oPtr->flags &= ~FILTER_HANDLING; return result; } static int FinalizeMethodRefs( void *data[], TCL_UNUSED(Tcl_Interp *), int result) { CallContext *contextPtr = (CallContext *) data[0]; Tcl_Size i; for (i = 0 ; i < contextPtr->callPtr->numChain ; i++) { TclOODelMethodRef(contextPtr->callPtr->chain[i].mPtr); } return result; } |
︙ | ︙ | |||
455 456 457 458 459 460 461 | Class *mixinPtr; Tcl_Obj *namePtr; Method *mPtr; Tcl_InitObjHashTable(&names); Tcl_InitHashTable(&examinedClasses, TCL_ONE_WORD_KEYS); | < < < < < < | 464 465 466 467 468 469 470 471 472 473 474 475 476 477 | Class *mixinPtr; Tcl_Obj *namePtr; Method *mPtr; Tcl_InitObjHashTable(&names); Tcl_InitHashTable(&examinedClasses, TCL_ONE_WORD_KEYS); /* * Process method names due to the object. */ if (oPtr->methodsPtr) { FOREACH_HASH(namePtr, mPtr, oPtr->methodsPtr) { if (IS_PRIVATE(mPtr)) { |
︙ | ︙ | |||
615 616 617 618 619 620 621 | /* * We need to build the list of methods to sort. We will be using qsort() * for this, because it is very unlikely that the list will be heavily * sorted when it is long enough to matter. */ | | | 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 | /* * We need to build the list of methods to sort. We will be using qsort() * for this, because it is very unlikely that the list will be heavily * sorted when it is long enough to matter. */ strings = (const char **) Tcl_Alloc(sizeof(char *) * namesPtr->numEntries); FOREACH_HASH(namePtr, isWanted, namesPtr) { if (!WANT_PUBLIC(flags) || (PTR2INT(isWanted) & IN_LIST)) { if (PTR2INT(isWanted) & NO_IMPLEMENTATION) { continue; } strings[i++] = TclGetString(namePtr); } |
︙ | ︙ | |||
637 638 639 640 641 642 643 | if (i > 0) { if (i > 1) { qsort((void *) strings, i, sizeof(char *), CmpStr); } *stringsPtr = strings; } else { | | | 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 | if (i > 0) { if (i > 1) { qsort((void *) strings, i, sizeof(char *), CmpStr); } *stringsPtr = strings; } else { Tcl_Free((void *) strings); *stringsPtr = NULL; } return i; } /* * Comparator for SortMethodNames |
︙ | ︙ | |||
673 674 675 676 677 678 679 | * * ---------------------------------------------------------------------- */ static void AddClassMethodNames( Class *clsPtr, /* Class to get method names from. */ | | | 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 | * * ---------------------------------------------------------------------- */ static void AddClassMethodNames( Class *clsPtr, /* Class to get method names from. */ int flags, /* Whether we are interested in just the * public method names. */ Tcl_HashTable *const namesPtr, /* Reference to the hash table to put the * information in. The hash table maps the * Tcl_Obj * method name to an integral value * describing whether the method is wanted. * This ensures that public/private override |
︙ | ︙ | |||
804 805 806 807 808 809 810 | int isWanted = PTR2INT(Tcl_GetHashValue(hPtr)); isWanted &= ~NO_IMPLEMENTATION; Tcl_SetHashValue(hPtr, INT2PTR(isWanted)); } } } | < < < < | | | 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 | int isWanted = PTR2INT(Tcl_GetHashValue(hPtr)); isWanted &= ~NO_IMPLEMENTATION; Tcl_SetHashValue(hPtr, INT2PTR(isWanted)); } } } /* * ---------------------------------------------------------------------- * * AddInstancePrivateToCallContext -- * * Add private methods from the instance. Called when the calling Tcl * context is a TclOO method declared by an object that is the same as * the current object. Returns true iff a private method was actually * found and added to the call chain (as this suppresses caching). * * ---------------------------------------------------------------------- */ static inline int AddInstancePrivateToCallContext( Object *const oPtr, /* Object to add call chain entries for. */ Tcl_Obj *const methodName, /* Name of method to add the call chain * entries for. */ ChainBuilder *const cbPtr, /* Where to add the call chain entries. */ int flags) /* What sort of call chain are we building. */ { Tcl_HashEntry *hPtr; Method *mPtr; int donePrivate = 0; if (oPtr->methodsPtr) { hPtr = Tcl_FindHashEntry(oPtr->methodsPtr, methodName); if (hPtr != NULL) { mPtr = (Method *) Tcl_GetHashValue(hPtr); if (IS_PRIVATE(mPtr)) { AddMethodToCallChain(mPtr, cbPtr, NULL, NULL, flags); donePrivate = 1; } } } return donePrivate; |
︙ | ︙ | |||
869 870 871 872 873 874 875 | Object *const oPtr, /* Object to add call chain entries for. */ Class *const contextCls, /* Context class; the currently considered * class is equal to this, private methods may * also be added. [TIP 500] */ Tcl_Obj *const methodNameObj, /* Name of method to add the call chain * entries for. */ | < | | | 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 | Object *const oPtr, /* Object to add call chain entries for. */ Class *const contextCls, /* Context class; the currently considered * class is equal to this, private methods may * also be added. [TIP 500] */ Tcl_Obj *const methodNameObj, /* Name of method to add the call chain * entries for. */ ChainBuilder *const cbPtr, /* Where to add the call chain entries. */ Tcl_HashTable *const doneFilters, /* Where to record what call chain entries * have been processed. */ int flags, /* What sort of call chain are we building. */ Class *const filterDecl) /* The class that declared the filter. If * NULL, either the filter was declared by the * object or this isn't a filter. */ { Tcl_Size i; int foundPrivate = 0, blockedUnexported = 0; Tcl_HashEntry *hPtr; Method *mPtr; if (!(flags & (KNOWN_STATE | SPECIAL)) && oPtr->methodsPtr) { hPtr = Tcl_FindHashEntry(oPtr->methodsPtr, methodNameObj); if (hPtr != NULL) { mPtr = (Method *) Tcl_GetHashValue(hPtr); if (!IS_PRIVATE(mPtr)) { if (WANT_PUBLIC(flags)) { if (!IS_PUBLIC(mPtr)) { blockedUnexported = 1; } else { flags |= DEFINITE_PUBLIC; } |
︙ | ︙ | |||
918 919 920 921 922 923 924 | foundPrivate |= AddSimpleClassChainToCallContext(mixinPtr, methodNameObj, cbPtr, doneFilters, flags | TRAVERSED_MIXIN, filterDecl); } if (oPtr->methodsPtr && !blockedUnexported) { hPtr = Tcl_FindHashEntry(oPtr->methodsPtr, methodNameObj); if (hPtr != NULL) { | | | 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 | foundPrivate |= AddSimpleClassChainToCallContext(mixinPtr, methodNameObj, cbPtr, doneFilters, flags | TRAVERSED_MIXIN, filterDecl); } if (oPtr->methodsPtr && !blockedUnexported) { hPtr = Tcl_FindHashEntry(oPtr->methodsPtr, methodNameObj); if (hPtr != NULL) { mPtr = (Method *) Tcl_GetHashValue(hPtr); if (!IS_PRIVATE(mPtr)) { AddMethodToCallChain(mPtr, cbPtr, doneFilters, filterDecl, flags); } } } } |
︙ | ︙ | |||
956 957 958 959 960 961 962 | * ---------------------------------------------------------------------- */ static inline void AddMethodToCallChain( Method *const mPtr, /* Actual method implementation to add to call * chain (or NULL, a no-op). */ | < | | 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 | * ---------------------------------------------------------------------- */ static inline void AddMethodToCallChain( Method *const mPtr, /* Actual method implementation to add to call * chain (or NULL, a no-op). */ ChainBuilder *const cbPtr, /* The call chain to add the method * implementation to. */ Tcl_HashTable *const doneFilters, /* Where to record what filters have been * processed. If NULL, not processing filters. * Note that this function does not update * this hashtable. */ Class *const filterDecl, /* The class that declared the filter. If |
︙ | ︙ | |||
1042 1043 1044 1045 1046 1047 1048 | /* * Need to really add the method. This is made a bit more complex by the * fact that we are using some "static" space initially, and only start * realloc-ing if the chain gets long. */ if (callPtr->numChain == CALL_CHAIN_STATIC_SIZE) { | | | | | | | 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 | /* * Need to really add the method. This is made a bit more complex by the * fact that we are using some "static" space initially, and only start * realloc-ing if the chain gets long. */ if (callPtr->numChain == CALL_CHAIN_STATIC_SIZE) { callPtr->chain = (MInvoke *) Tcl_Alloc(sizeof(MInvoke) * (callPtr->numChain + 1)); memcpy(callPtr->chain, callPtr->staticChain, sizeof(MInvoke) * callPtr->numChain); } else if (callPtr->numChain > CALL_CHAIN_STATIC_SIZE) { callPtr->chain = (MInvoke *) Tcl_Realloc(callPtr->chain, sizeof(MInvoke) * (callPtr->numChain + 1)); } callPtr->chain[i].mPtr = mPtr; callPtr->chain[i].isFilter = (doneFilters != NULL); callPtr->chain[i].filterDeclarer = filterDecl; callPtr->numChain++; } |
︙ | ︙ | |||
1174 1175 1176 1177 1178 1179 1180 | * also be added. [TIP 500] */ Tcl_Obj *cacheInThisObj) /* What object to cache in, or NULL if it is * to be in the same object as the * methodNameObj. */ { CallContext *contextPtr; CallChain *callPtr; | | | 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 | * also be added. [TIP 500] */ Tcl_Obj *cacheInThisObj) /* What object to cache in, or NULL if it is * to be in the same object as the * methodNameObj. */ { CallContext *contextPtr; CallChain *callPtr; ChainBuilder cb; Tcl_Size i, count; int doFilters, donePrivate = 0; Tcl_HashEntry *hPtr; Tcl_HashTable doneFilters; if (cacheInThisObj == NULL) { cacheInThisObj = methodNameObj; |
︙ | ︙ | |||
1220 1221 1222 1223 1224 1225 1226 | * the object, and in the class). */ const Tcl_ObjInternalRep *irPtr; const int reuseMask = (WANT_PUBLIC(flags) ? ~0 : ~PUBLIC_METHOD); if ((irPtr = TclFetchInternalRep(cacheInThisObj, &methodNameType))) { | | | 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 | * the object, and in the class). */ const Tcl_ObjInternalRep *irPtr; const int reuseMask = (WANT_PUBLIC(flags) ? ~0 : ~PUBLIC_METHOD); if ((irPtr = TclFetchInternalRep(cacheInThisObj, &methodNameType))) { callPtr = (CallChain *) irPtr->twoPtrValue.ptr1; if (IsStillValid(callPtr, oPtr, flags, reuseMask)) { callPtr->refCount++; goto returnContext; } Tcl_StoreInternalRep(cacheInThisObj, &methodNameType, NULL); } |
︙ | ︙ | |||
1253 1254 1255 1256 1257 1258 1259 | methodNameObj); } else { hPtr = NULL; } } if (hPtr != NULL && Tcl_GetHashValue(hPtr) != NULL) { | | | | 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 | methodNameObj); } else { hPtr = NULL; } } if (hPtr != NULL && Tcl_GetHashValue(hPtr) != NULL) { callPtr = (CallChain *) Tcl_GetHashValue(hPtr); if (IsStillValid(callPtr, oPtr, flags, reuseMask)) { callPtr->refCount++; goto returnContext; } Tcl_SetHashValue(hPtr, NULL); TclOODeleteChain(callPtr); } doFilters = 1; } callPtr = (CallChain *) Tcl_Alloc(sizeof(CallChain)); InitCallChain(callPtr, oPtr, flags); cb.callChainPtr = callPtr; cb.filterLength = 0; cb.oPtr = oPtr; /* |
︙ | ︙ | |||
1370 1371 1372 1373 1374 1375 1376 | return NULL; } } else if (doFilters && !donePrivate) { if (hPtr == NULL) { int isNew; if (oPtr->flags & USE_CLASS_CACHE) { if (oPtr->selfCls->classChainCache == NULL) { | | | | > | 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 | return NULL; } } else if (doFilters && !donePrivate) { if (hPtr == NULL) { int isNew; if (oPtr->flags & USE_CLASS_CACHE) { if (oPtr->selfCls->classChainCache == NULL) { oPtr->selfCls->classChainCache = (Tcl_HashTable *) Tcl_Alloc(sizeof(Tcl_HashTable)); Tcl_InitObjHashTable(oPtr->selfCls->classChainCache); } hPtr = Tcl_CreateHashEntry(oPtr->selfCls->classChainCache, methodNameObj, &isNew); } else { if (oPtr->chainCache == NULL) { oPtr->chainCache = (Tcl_HashTable *) Tcl_Alloc(sizeof(Tcl_HashTable)); Tcl_InitObjHashTable(oPtr->chainCache); } hPtr = Tcl_CreateHashEntry(oPtr->chainCache, methodNameObj, &isNew); } } |
︙ | ︙ | |||
1405 1406 1407 1408 1409 1410 1411 | TclOODeleteChain(oPtr->selfCls->destructorChainPtr); } oPtr->selfCls->destructorChainPtr = callPtr; callPtr->refCount++; } returnContext: | > | | 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 | TclOODeleteChain(oPtr->selfCls->destructorChainPtr); } oPtr->selfCls->destructorChainPtr = callPtr; callPtr->refCount++; } returnContext: contextPtr = (CallContext *) TclStackAlloc(oPtr->fPtr->interp, sizeof(CallContext)); contextPtr->oPtr = oPtr; /* * Corresponding TclOODecrRefCount() in TclOODeleteContext */ AddRef(oPtr); |
︙ | ︙ | |||
1443 1444 1445 1446 1447 1448 1449 | * destructor chain. */ int flags) /* What sort of context are we looking for. * Only the bits PUBLIC_METHOD, CONSTRUCTOR, * PRIVATE_METHOD, DESTRUCTOR and * FILTER_HANDLING are useful. */ { CallChain *callPtr; | | | 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 | * destructor chain. */ int flags) /* What sort of context are we looking for. * Only the bits PUBLIC_METHOD, CONSTRUCTOR, * PRIVATE_METHOD, DESTRUCTOR and * FILTER_HANDLING are useful. */ { CallChain *callPtr; ChainBuilder cb; Tcl_Size count; Foundation *fPtr = clsPtr->thisPtr->fPtr; Tcl_HashEntry *hPtr; Tcl_HashTable doneFilters; Object obj; /* |
︙ | ︙ | |||
1485 1486 1487 1488 1489 1490 1491 | if (clsPtr->classChainCache != NULL) { hPtr = Tcl_FindHashEntry(clsPtr->classChainCache, methodNameObj); if (hPtr != NULL && Tcl_GetHashValue(hPtr) != NULL) { const int reuseMask = (WANT_PUBLIC(flags) ? ~0 : ~PUBLIC_METHOD); | | | | 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 | if (clsPtr->classChainCache != NULL) { hPtr = Tcl_FindHashEntry(clsPtr->classChainCache, methodNameObj); if (hPtr != NULL && Tcl_GetHashValue(hPtr) != NULL) { const int reuseMask = (WANT_PUBLIC(flags) ? ~0 : ~PUBLIC_METHOD); callPtr = (CallChain *) Tcl_GetHashValue(hPtr); if (IsStillValid(callPtr, &obj, flags, reuseMask)) { callPtr->refCount++; return callPtr; } Tcl_SetHashValue(hPtr, NULL); TclOODeleteChain(callPtr); } } else { hPtr = NULL; } callPtr = (CallChain *) Tcl_Alloc(sizeof(CallChain)); memset(callPtr, 0, sizeof(CallChain)); callPtr->flags = flags & (PUBLIC_METHOD|PRIVATE_METHOD|FILTER_HANDLING); callPtr->epoch = fPtr->epoch; callPtr->objectCreationEpoch = fPtr->tsdPtr->nsCount; callPtr->objectEpoch = clsPtr->thisPtr->epoch; callPtr->refCount = 1; callPtr->chain = callPtr->staticChain; |
︙ | ︙ | |||
1553 1554 1555 1556 1557 1558 1559 | TclOODeleteChain(callPtr); return NULL; } } else { if (hPtr == NULL) { int isNew; if (clsPtr->classChainCache == NULL) { | | > | 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 | TclOODeleteChain(callPtr); return NULL; } } else { if (hPtr == NULL) { int isNew; if (clsPtr->classChainCache == NULL) { clsPtr->classChainCache = (Tcl_HashTable *) Tcl_Alloc(sizeof(Tcl_HashTable)); Tcl_InitObjHashTable(clsPtr->classChainCache); } hPtr = Tcl_CreateHashEntry(clsPtr->classChainCache, methodNameObj, &isNew); } callPtr->refCount++; Tcl_SetHashValue(hPtr, callPtr); |
︙ | ︙ | |||
1581 1582 1583 1584 1585 1586 1587 | * ---------------------------------------------------------------------- */ static void AddClassFiltersToCallContext( Object *const oPtr, /* Object that the filters operate on. */ Class *clsPtr, /* Class to get the filters from. */ | < | | 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 | * ---------------------------------------------------------------------- */ static void AddClassFiltersToCallContext( Object *const oPtr, /* Object that the filters operate on. */ Class *clsPtr, /* Class to get the filters from. */ ChainBuilder *const cbPtr, /* Context to fill with call chain entries. */ Tcl_HashTable *const doneFilters, /* Where to record what filters have been * processed. Keys are objects, values are * ignored. */ int flags) /* Whether we've gone along a mixin link * yet. */ { |
︙ | ︙ | |||
1669 1670 1671 1672 1673 1674 1675 | AddPrivatesFromClassChainToCallContext( Class *classPtr, /* Class to add the call chain entries for. */ Class *const contextCls, /* Context class; the currently considered * class is equal to this, private methods may * also be added. */ Tcl_Obj *const methodName, /* Name of method to add the call chain * entries for. */ | < | | 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 | AddPrivatesFromClassChainToCallContext( Class *classPtr, /* Class to add the call chain entries for. */ Class *const contextCls, /* Context class; the currently considered * class is equal to this, private methods may * also be added. */ Tcl_Obj *const methodName, /* Name of method to add the call chain * entries for. */ ChainBuilder *const cbPtr, /* Where to add the call chain entries. */ Tcl_HashTable *const doneFilters, /* Where to record what call chain entries * have been processed. */ int flags, /* What sort of call chain are we building. */ Class *const filterDecl) /* The class that declared the filter. If * NULL, either the filter was declared by the * object or this isn't a filter. */ |
︙ | ︙ | |||
1711 1712 1713 1714 1715 1716 1717 | } if (classPtr == contextCls) { Tcl_HashEntry *hPtr = Tcl_FindHashEntry(&classPtr->classMethods, methodName); if (hPtr != NULL) { | | | 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 | } if (classPtr == contextCls) { Tcl_HashEntry *hPtr = Tcl_FindHashEntry(&classPtr->classMethods, methodName); if (hPtr != NULL) { Method *mPtr = (Method *) Tcl_GetHashValue(hPtr); if (IS_PRIVATE(mPtr)) { AddMethodToCallChain(mPtr, cbPtr, doneFilters, filterDecl, flags); return 1; } } |
︙ | ︙ | |||
1754 1755 1756 1757 1758 1759 1760 | static int AddSimpleClassChainToCallContext( Class *classPtr, /* Class to add the call chain entries for. */ Tcl_Obj *const methodNameObj, /* Name of method to add the call chain * entries for. */ | < | | 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 | static int AddSimpleClassChainToCallContext( Class *classPtr, /* Class to add the call chain entries for. */ Tcl_Obj *const methodNameObj, /* Name of method to add the call chain * entries for. */ ChainBuilder *const cbPtr, /* Where to add the call chain entries. */ Tcl_HashTable *const doneFilters, /* Where to record what call chain entries * have been processed. */ int flags, /* What sort of call chain are we building. */ Class *const filterDecl) /* The class that declared the filter. If * NULL, either the filter was declared by the * object or this isn't a filter. */ |
︙ | ︙ | |||
1800 1801 1802 1803 1804 1805 1806 | Tcl_HashEntry *hPtr = Tcl_FindHashEntry(&classPtr->classMethods, methodNameObj); if (classPtr->flags & HAS_PRIVATE_METHODS) { privateDanger |= 1; } if (hPtr != NULL) { | | | 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 | Tcl_HashEntry *hPtr = Tcl_FindHashEntry(&classPtr->classMethods, methodNameObj); if (classPtr->flags & HAS_PRIVATE_METHODS) { privateDanger |= 1; } if (hPtr != NULL) { Method *mPtr = (Method *) Tcl_GetHashValue(hPtr); if (!IS_PRIVATE(mPtr)) { if (!(flags & KNOWN_STATE)) { if (flags & PUBLIC_METHOD) { if (!IS_PUBLIC(mPtr)) { return privateDanger; } |
︙ | ︙ | |||
1860 1861 1862 1863 1864 1865 1866 | Tcl_Size i; /* * Allocate the literals (potentially) used in our description. */ TclNewLiteralStringObj(filterLiteral, "filter"); | < < < < > | | | 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 | Tcl_Size i; /* * Allocate the literals (potentially) used in our description. */ TclNewLiteralStringObj(filterLiteral, "filter"); TclNewLiteralStringObj(methodLiteral, "method"); TclNewLiteralStringObj(objectLiteral, "object"); TclNewLiteralStringObj(privateLiteral, "private"); /* * Do the actual construction of the descriptions. They consist of a list * of triples that describe the details of how a method is understood. For * each triple, the first word is the type of invocation ("method" is * normal, "unknown" is special because it adds the method name as an * extra argument when handled by some method types, and "filter" is * special because it's a filter method). The second word is the name of * the method in question (which differs for "unknown" and "filter" types) * and the third word is the full name of the class that declares the * method (or "object" if it is declared on the instance). */ objv = (Tcl_Obj **) TclStackAlloc(interp, callPtr->numChain * sizeof(Tcl_Obj *)); for (i = 0 ; i < callPtr->numChain ; i++) { MInvoke *miPtr = &callPtr->chain[i]; descObjs[0] = miPtr->isFilter ? filterLiteral : callPtr->flags & OO_UNKNOWN_METHOD ? fPtr->unknownMethodNameObj : IS_PRIVATE(miPtr->mPtr) ? privateLiteral : methodLiteral; descObjs[1] = |
︙ | ︙ | |||
1907 1908 1909 1910 1911 1912 1913 | } /* * Drop the local references to the literals; if they're actually used, * they'll live on the description itself. */ | | | | | | 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 | } /* * Drop the local references to the literals; if they're actually used, * they'll live on the description itself. */ Tcl_BounceRefCount(filterLiteral); Tcl_BounceRefCount(methodLiteral); Tcl_BounceRefCount(objectLiteral); Tcl_BounceRefCount(privateLiteral); /* * Finish building the description and return it. */ resultObj = Tcl_NewListObj(callPtr->numChain, objv); TclStackFree(interp, objv); |
︙ | ︙ | |||
2086 2087 2088 2089 2090 2091 2092 | * reallocating the space for the chain if necessary. * * ---------------------------------------------------------------------- */ static inline void AddDefinitionNamespaceToChain( | | | > | 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 | * reallocating the space for the chain if necessary. * * ---------------------------------------------------------------------- */ static inline void AddDefinitionNamespaceToChain( Class *const definerCls, /* What class defines this entry. */ Tcl_Obj *const namespaceName, /* The name for this entry (or NULL, a * no-op). */ DefineChain *const definePtr, /* The define chain to add the method * implementation to. */ int flags) /* Used to check if we're mixin-consistent * only. Mixin-consistent means that either * we're looking to add things from a mixin |
︙ | ︙ | |||
2147 2148 2149 2150 2151 2152 2153 | */ if (definePtr->num == definePtr->size) { definePtr->size *= 2; if (definePtr->num == DEFINE_CHAIN_STATIC_SIZE) { DefineEntry *staticList = definePtr->list; | | | | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 | */ if (definePtr->num == definePtr->size) { definePtr->size *= 2; if (definePtr->num == DEFINE_CHAIN_STATIC_SIZE) { DefineEntry *staticList = definePtr->list; definePtr->list = (DefineEntry *) Tcl_Alloc(sizeof(DefineEntry) * definePtr->size); memcpy(definePtr->list, staticList, sizeof(DefineEntry) * definePtr->num); } else { definePtr->list = (DefineEntry *) Tcl_Realloc(definePtr->list, sizeof(DefineEntry) * definePtr->size); } } definePtr->list[i].definerCls = definerCls; definePtr->list[i].namespaceName = namespaceName; definePtr->num++; } /* * Local Variables: * mode: c * c-basic-offset: 4 * fill-column: 78 * End: */ |
Changes to generic/tclOODefineCmds.c.
︙ | ︙ | |||
28 29 30 31 32 33 34 | */ #define OBJNAME_LENGTH_IN_ERRORINFO_LIMIT 30 /* * Some things that make it easier to declare a slot. */ | < | | | 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | */ #define OBJNAME_LENGTH_IN_ERRORINFO_LIMIT 30 /* * Some things that make it easier to declare a slot. */ typedef struct DeclaredSlot { const char *name; const Tcl_MethodType getterType; const Tcl_MethodType setterType; const Tcl_MethodType resolverType; } DeclaredSlot; #define SLOT(name,getter,setter,resolver) \ {"::oo::" name, \ {TCL_OO_METHOD_VERSION_CURRENT, "core method: " name " Getter", \ getter, NULL, NULL}, \ {TCL_OO_METHOD_VERSION_CURRENT, "core method: " name " Setter", \ setter, NULL, NULL}, \ |
︙ | ︙ | |||
75 76 77 78 79 80 81 | static inline int InitDefineContext(Tcl_Interp *interp, Tcl_Namespace *namespacePtr, Object *oPtr, int objc, Tcl_Obj *const objv[]); static inline void RecomputeClassCacheFlag(Object *oPtr); static int RenameDeleteMethod(Tcl_Interp *interp, Object *oPtr, int useClass, Tcl_Obj *const fromPtr, Tcl_Obj *const toPtr); | | | | | | | | > > > > > > > > > > > > | | | > | > > > | | | | | | > > | > > | | | | | | | | > | > | > | > | | 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 | static inline int InitDefineContext(Tcl_Interp *interp, Tcl_Namespace *namespacePtr, Object *oPtr, int objc, Tcl_Obj *const objv[]); static inline void RecomputeClassCacheFlag(Object *oPtr); static int RenameDeleteMethod(Tcl_Interp *interp, Object *oPtr, int useClass, Tcl_Obj *const fromPtr, Tcl_Obj *const toPtr); static int ClassFilter_Get(void *clientData, Tcl_Interp *interp, Tcl_ObjectContext context, int objc, Tcl_Obj *const *objv); static int ClassFilter_Set(void *clientData, Tcl_Interp *interp, Tcl_ObjectContext context, int objc, Tcl_Obj *const *objv); static int ClassMixin_Get(void *clientData, Tcl_Interp *interp, Tcl_ObjectContext context, int objc, Tcl_Obj *const *objv); static int ClassMixin_Set(void *clientData, Tcl_Interp *interp, Tcl_ObjectContext context, int objc, Tcl_Obj *const *objv); static int ClassSuper_Get(void *clientData, Tcl_Interp *interp, Tcl_ObjectContext context, int objc, Tcl_Obj *const *objv); static int ClassSuper_Set(void *clientData, Tcl_Interp *interp, Tcl_ObjectContext context, int objc, Tcl_Obj *const *objv); static int ClassVars_Get(void *clientData, Tcl_Interp *interp, Tcl_ObjectContext context, int objc, Tcl_Obj *const *objv); static int ClassVars_Set(void *clientData, Tcl_Interp *interp, Tcl_ObjectContext context, int objc, Tcl_Obj *const *objv); static int ObjFilter_Get(void *clientData, Tcl_Interp *interp, Tcl_ObjectContext context, int objc, Tcl_Obj *const *objv); static int ObjFilter_Set(void *clientData, Tcl_Interp *interp, Tcl_ObjectContext context, int objc, Tcl_Obj *const *objv); static int ObjMixin_Get(void *clientData, Tcl_Interp *interp, Tcl_ObjectContext context, int objc, Tcl_Obj *const *objv); static int ObjMixin_Set(void *clientData, Tcl_Interp *interp, Tcl_ObjectContext context, int objc, Tcl_Obj *const *objv); static int ObjVars_Get(void *clientData, Tcl_Interp *interp, Tcl_ObjectContext context, int objc, Tcl_Obj *const *objv); static int ObjVars_Set(void *clientData, Tcl_Interp *interp, Tcl_ObjectContext context, int objc, Tcl_Obj *const *objv); static int Configurable_ClassReadableProps_Get(void *clientData, Tcl_Interp *interp, Tcl_ObjectContext context, int objc, Tcl_Obj *const *objv); static int Configurable_ClassReadableProps_Set(void *clientData, Tcl_Interp *interp, Tcl_ObjectContext context, int objc, Tcl_Obj *const *objv); static int Configurable_ClassWritableProps_Get(void *clientData, Tcl_Interp *interp, Tcl_ObjectContext context, int objc, Tcl_Obj *const *objv); static int Configurable_ClassWritableProps_Set(void *clientData, Tcl_Interp *interp, Tcl_ObjectContext context, int objc, Tcl_Obj *const *objv); static int Configurable_ObjectReadableProps_Get(void *clientData, Tcl_Interp *interp, Tcl_ObjectContext context, int objc, Tcl_Obj *const *objv); static int Configurable_ObjectReadableProps_Set(void *clientData, Tcl_Interp *interp, Tcl_ObjectContext context, int objc, Tcl_Obj *const *objv); static int Configurable_ObjectWritableProps_Get(void *clientData, Tcl_Interp *interp, Tcl_ObjectContext context, int objc, Tcl_Obj *const *objv); static int Configurable_ObjectWritableProps_Set(void *clientData, Tcl_Interp *interp, Tcl_ObjectContext context, int objc, Tcl_Obj *const *objv); static int ResolveClass(void *clientData, Tcl_Interp *interp, Tcl_ObjectContext context, int objc, Tcl_Obj *const *objv); /* * Now define the slots used in declarations. */ static const DeclaredSlot slots[] = { SLOT("define::filter", ClassFilter_Get, ClassFilter_Set, NULL), SLOT("define::mixin", ClassMixin_Get, ClassMixin_Set, ResolveClass), SLOT("define::superclass", ClassSuper_Get, ClassSuper_Set, ResolveClass), SLOT("define::variable", ClassVars_Get, ClassVars_Set, NULL), SLOT("objdefine::filter", ObjFilter_Get, ObjFilter_Set, NULL), SLOT("objdefine::mixin", ObjMixin_Get, ObjMixin_Set, ResolveClass), SLOT("objdefine::variable", ObjVars_Get, ObjVars_Set, NULL), SLOT("configuresupport::readableproperties", Configurable_ClassReadableProps_Get, Configurable_ClassReadableProps_Set, NULL), SLOT("configuresupport::writableproperties", Configurable_ClassWritableProps_Get, Configurable_ClassWritableProps_Set, NULL), SLOT("configuresupport::objreadableproperties", Configurable_ObjectReadableProps_Get, Configurable_ObjectReadableProps_Set, NULL), SLOT("configuresupport::objwritableproperties", Configurable_ObjectWritableProps_Get, Configurable_ObjectWritableProps_Set, NULL), {NULL, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}} }; /* * How to build the in-namespace name of a private variable. This is a pattern * used with Tcl_ObjPrintf(). */ |
︙ | ︙ | |||
326 327 328 329 330 331 332 | RecomputeClassCacheFlag(oPtr); } else { /* * We've got a list of filters, so we're creating filters. */ Tcl_Obj **filtersList; | | | | | | 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 | RecomputeClassCacheFlag(oPtr); } else { /* * We've got a list of filters, so we're creating filters. */ Tcl_Obj **filtersList; size_t size = sizeof(Tcl_Obj *) * numFilters; if (oPtr->filters.num == 0) { filtersList = (Tcl_Obj **) Tcl_Alloc(size); } else { filtersList = (Tcl_Obj **) Tcl_Realloc(oPtr->filters.list, size); } for (i = 0 ; i < numFilters ; i++) { filtersList[i] = filters[i]; Tcl_IncrRefCount(filters[i]); } oPtr->filters.list = filtersList; oPtr->filters.num = numFilters; oPtr->flags &= ~USE_CLASS_CACHE; } BumpInstanceEpoch(oPtr); // Only this object can be affected. } /* * ---------------------------------------------------------------------- * * TclOOClassSetFilters -- * |
︙ | ︙ | |||
385 386 387 388 389 390 391 | classPtr->filters.num = 0; } else { /* * We've got a list of filters, so we're creating filters. */ Tcl_Obj **filtersList; | | | | > | 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 | classPtr->filters.num = 0; } else { /* * We've got a list of filters, so we're creating filters. */ Tcl_Obj **filtersList; size_t size = sizeof(Tcl_Obj *) * numFilters; if (classPtr->filters.num == 0) { filtersList = (Tcl_Obj **) Tcl_Alloc(size); } else { filtersList = (Tcl_Obj **) Tcl_Realloc(classPtr->filters.list, size); } for (i = 0 ; i < numFilters ; i++) { filtersList[i] = filters[i]; Tcl_IncrRefCount(filters[i]); } classPtr->filters.list = filtersList; classPtr->filters.num = numFilters; |
︙ | ︙ | |||
444 445 446 447 448 449 450 | if (oPtr->mixins.num != 0) { FOREACH(mixinPtr, oPtr->mixins) { if (mixinPtr && mixinPtr != oPtr->selfCls) { TclOORemoveFromInstances(oPtr, mixinPtr); } TclOODecrRefCount(mixinPtr->thisPtr); } | | | > | 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 | if (oPtr->mixins.num != 0) { FOREACH(mixinPtr, oPtr->mixins) { if (mixinPtr && mixinPtr != oPtr->selfCls) { TclOORemoveFromInstances(oPtr, mixinPtr); } TclOODecrRefCount(mixinPtr->thisPtr); } oPtr->mixins.list = (Class **) Tcl_Realloc(oPtr->mixins.list, sizeof(Class *) * numMixins); } else { oPtr->mixins.list = (Class **) Tcl_Alloc(sizeof(Class *) * numMixins); oPtr->flags &= ~USE_CLASS_CACHE; } oPtr->mixins.num = numMixins; memcpy(oPtr->mixins.list, mixins, sizeof(Class *) * numMixins); FOREACH(mixinPtr, oPtr->mixins) { if (mixinPtr != oPtr->selfCls) { TclOOAddToInstances(oPtr, mixinPtr); |
︙ | ︙ | |||
502 503 504 505 506 507 508 | } } else { if (classPtr->mixins.num != 0) { FOREACH(mixinPtr, classPtr->mixins) { TclOORemoveFromMixinSubs(classPtr, mixinPtr); TclOODecrRefCount(mixinPtr->thisPtr); } | | > | | > | 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 | } } else { if (classPtr->mixins.num != 0) { FOREACH(mixinPtr, classPtr->mixins) { TclOORemoveFromMixinSubs(classPtr, mixinPtr); TclOODecrRefCount(mixinPtr->thisPtr); } classPtr->mixins.list = (Class **) Tcl_Realloc(classPtr->mixins.list, sizeof(Class *) * numMixins); } else { classPtr->mixins.list = (Class **) Tcl_Alloc(sizeof(Class *) * numMixins); } classPtr->mixins.num = numMixins; memcpy(classPtr->mixins.list, mixins, sizeof(Class *) * numMixins); FOREACH(mixinPtr, classPtr->mixins) { TclOOAddToMixinSubs(classPtr, mixinPtr); /* |
︙ | ︙ | |||
553 554 555 556 557 558 559 | FOREACH(variableObj, *vnlPtr) { Tcl_DecrRefCount(variableObj); } if (i != varc) { if (varc == 0) { Tcl_Free(vnlPtr->list); } else if (i) { | > | | > | | 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 | FOREACH(variableObj, *vnlPtr) { Tcl_DecrRefCount(variableObj); } if (i != varc) { if (varc == 0) { Tcl_Free(vnlPtr->list); } else if (i) { vnlPtr->list = (Tcl_Obj **) Tcl_Realloc(vnlPtr->list, sizeof(Tcl_Obj *) * varc); } else { vnlPtr->list = (Tcl_Obj **) Tcl_Alloc(sizeof(Tcl_Obj *) * varc); } } vnlPtr->num = 0; if (varc > 0) { Tcl_InitObjHashTable(&uniqueTable); for (i=n=0 ; i<varc ; i++) { Tcl_CreateHashEntry(&uniqueTable, varv[i], &created); if (created) { vnlPtr->list[n++] = varv[i]; } else { Tcl_DecrRefCount(varv[i]); } } vnlPtr->num = n; /* * Shouldn't be necessary, but maintain num/list invariant. */ if (n != varc) { vnlPtr->list = (Tcl_Obj **) Tcl_Realloc(vnlPtr->list, sizeof(Tcl_Obj *) * n); } Tcl_DeleteHashTable(&uniqueTable); } } static inline void InstallPrivateVariableMapping( |
︙ | ︙ | |||
605 606 607 608 609 610 611 | Tcl_DecrRefCount(privatePtr->variableObj); Tcl_DecrRefCount(privatePtr->fullNameObj); } if (i != varc) { if (varc == 0) { Tcl_Free(pvlPtr->list); } else if (i) { | | > | | > | 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 | Tcl_DecrRefCount(privatePtr->variableObj); Tcl_DecrRefCount(privatePtr->fullNameObj); } if (i != varc) { if (varc == 0) { Tcl_Free(pvlPtr->list); } else if (i) { pvlPtr->list = (PrivateVariableMapping *) Tcl_Realloc(pvlPtr->list, sizeof(PrivateVariableMapping) * varc); } else { pvlPtr->list = (PrivateVariableMapping *) Tcl_Alloc(sizeof(PrivateVariableMapping) * varc); } } pvlPtr->num = 0; if (varc > 0) { Tcl_InitObjHashTable(&uniqueTable); for (i=n=0 ; i<varc ; i++) { |
︙ | ︙ | |||
635 636 637 638 639 640 641 | pvlPtr->num = n; /* * Shouldn't be necessary, but maintain num/list invariant. */ if (n != varc) { | | | 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 | pvlPtr->num = n; /* * Shouldn't be necessary, but maintain num/list invariant. */ if (n != varc) { pvlPtr->list = (PrivateVariableMapping *) Tcl_Realloc(pvlPtr->list, sizeof(PrivateVariableMapping) * n); } Tcl_DeleteHashTable(&uniqueTable); } } /* |
︙ | ︙ | |||
715 716 717 718 719 720 721 | } } /* * Complete the splicing by changing the method's name. */ | | | 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 | } } /* * Complete the splicing by changing the method's name. */ mPtr = (Method *) Tcl_GetHashValue(hPtr); if (toPtr) { Tcl_IncrRefCount(toPtr); Tcl_DecrRefCount(mPtr->namePtr); mPtr->namePtr = toPtr; Tcl_SetHashValue(newHPtr, mPtr); } else { if (!useClass) { |
︙ | ︙ | |||
773 774 775 776 777 778 779 | soughtStr = TclGetStringFromObj(objv[1], &soughtLen); if (soughtLen == 0) { goto noMatch; } hPtr = Tcl_FirstHashEntry(&nsPtr->cmdTable, &search); while (hPtr != NULL) { | | > | 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 | soughtStr = TclGetStringFromObj(objv[1], &soughtLen); if (soughtLen == 0) { goto noMatch; } hPtr = Tcl_FirstHashEntry(&nsPtr->cmdTable, &search); while (hPtr != NULL) { const char *nameStr = (const char *) Tcl_GetHashKey(&nsPtr->cmdTable, hPtr); if (strncmp(soughtStr, nameStr, soughtLen) == 0) { if (matchedStr != NULL) { goto noMatch; } matchedStr = nameStr; } |
︙ | ︙ | |||
917 918 919 920 921 922 923 | * incremented here. */ return TCL_OK; } /* * ---------------------------------------------------------------------- * | | | 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 | * incremented here. */ return TCL_OK; } /* * ---------------------------------------------------------------------- * * TclOOGetDefineCmdContext, TclOOGetClassDefineCmdContext -- * * Extracts the magic token from the current stack frame, or returns NULL * (and leaves an error message) otherwise. * * ---------------------------------------------------------------------- */ |
︙ | ︙ | |||
941 942 943 944 945 946 947 | && iPtr->varFramePtr->isProcCallFrame != PRIVATE_FRAME)) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "this command may only be called from within the context of" " an ::oo::define or ::oo::objdefine command", -1)); Tcl_SetErrorCode(interp, "TCL", "OO", "MONKEY_BUSINESS", (char *)NULL); return NULL; } | | > > > > > > > > > > > > > > > > > | 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 | && iPtr->varFramePtr->isProcCallFrame != PRIVATE_FRAME)) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "this command may only be called from within the context of" " an ::oo::define or ::oo::objdefine command", -1)); Tcl_SetErrorCode(interp, "TCL", "OO", "MONKEY_BUSINESS", (char *)NULL); return NULL; } object = (Tcl_Object) iPtr->varFramePtr->clientData; if (Tcl_ObjectDeleted(object)) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "this command cannot be called when the object has been" " deleted", -1)); Tcl_SetErrorCode(interp, "TCL", "OO", "MONKEY_BUSINESS", (char *)NULL); return NULL; } return object; } Class * TclOOGetClassDefineCmdContext( Tcl_Interp *interp) { Object *oPtr = (Object *) TclOOGetDefineCmdContext(interp); if (oPtr == NULL) { return NULL; } if (!oPtr->classPtr) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "attempt to misuse API", -1)); Tcl_SetErrorCode(interp, "TCL", "OO", "MONKEY_BUSINESS", NULL); return NULL; } return oPtr->classPtr; } /* * ---------------------------------------------------------------------- * * GetClassInOuterContext, GetNamespaceInOuterContext -- * * Wrappers round Tcl_GetObjectFromObj and TclGetNamespaceFromObj to |
︙ | ︙ | |||
1056 1057 1058 1059 1060 1061 1062 | ? savedNameObj : TclOOObjectName(interp, oPtr); const char *objName = TclGetStringFromObj(realNameObj, &length); int limit = OBJNAME_LENGTH_IN_ERRORINFO_LIMIT; int overflow = (length > limit); Tcl_AppendObjToErrorInfo(interp, Tcl_ObjPrintf( "\n (in definition script for %s \"%.*s%s\" line %d)", | | | 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 | ? savedNameObj : TclOOObjectName(interp, oPtr); const char *objName = TclGetStringFromObj(realNameObj, &length); int limit = OBJNAME_LENGTH_IN_ERRORINFO_LIMIT; int overflow = (length > limit); Tcl_AppendObjToErrorInfo(interp, Tcl_ObjPrintf( "\n (in definition script for %s \"%.*s%s\" line %d)", typeOfSubject, (overflow ? limit : (int) length), objName, (overflow ? "..." : ""), Tcl_GetErrorLine(interp))); } /* * ---------------------------------------------------------------------- * * MagicDefinitionInvoke -- |
︙ | ︙ | |||
1115 1116 1117 1118 1119 1120 1121 | */ Tcl_AppendObjToObj(obj2Ptr, objv[cmdIndex]); } else { Tcl_GetCommandFullName(interp, cmd, obj2Ptr); } Tcl_ListObjAppendElement(NULL, objPtr, obj2Ptr); | | | 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 | */ Tcl_AppendObjToObj(obj2Ptr, objv[cmdIndex]); } else { Tcl_GetCommandFullName(interp, cmd, obj2Ptr); } Tcl_ListObjAppendElement(NULL, objPtr, obj2Ptr); // TODO: overflow? Tcl_ListObjReplace(NULL, objPtr, 1, 0, objc - offset, objv + offset); TclListObjGetElements(NULL, objPtr, &dummy, &objs); result = Tcl_EvalObjv(interp, objc - cmdIndex, objs, TCL_EVAL_INVOKE); if (isRoot) { TclResetRewriteEnsemble(interp, 1); } |
︙ | ︙ | |||
1186 1187 1188 1189 1190 1191 1192 | AddRef(oPtr); if (objc == 3) { Tcl_Obj *objNameObj = TclOOObjectName(interp, oPtr); Tcl_IncrRefCount(objNameObj); result = TclEvalObjEx(interp, objv[2], 0, | | | 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 | AddRef(oPtr); if (objc == 3) { Tcl_Obj *objNameObj = TclOOObjectName(interp, oPtr); Tcl_IncrRefCount(objNameObj); result = TclEvalObjEx(interp, objv[2], 0, ((Interp *) interp)->cmdFramePtr, 2); if (result == TCL_ERROR) { GenerateErrorInfo(interp, oPtr, objNameObj, "class"); } TclDecrRefCount(objNameObj); } else { result = MagicDefinitionInvoke(interp, nsPtr, 2, objc, objv); } |
︙ | ︙ | |||
1255 1256 1257 1258 1259 1260 1261 | AddRef(oPtr); if (objc == 3) { Tcl_Obj *objNameObj = TclOOObjectName(interp, oPtr); Tcl_IncrRefCount(objNameObj); result = TclEvalObjEx(interp, objv[2], 0, | | | 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 | AddRef(oPtr); if (objc == 3) { Tcl_Obj *objNameObj = TclOOObjectName(interp, oPtr); Tcl_IncrRefCount(objNameObj); result = TclEvalObjEx(interp, objv[2], 0, ((Interp *) interp)->cmdFramePtr, 2); if (result == TCL_ERROR) { GenerateErrorInfo(interp, oPtr, objNameObj, "object"); } TclDecrRefCount(objNameObj); } else { result = MagicDefinitionInvoke(interp, nsPtr, 2, objc, objv); } |
︙ | ︙ | |||
1329 1330 1331 1332 1333 1334 1335 | AddRef(oPtr); if (objc == 2) { Tcl_Obj *objNameObj = TclOOObjectName(interp, oPtr); Tcl_IncrRefCount(objNameObj); result = TclEvalObjEx(interp, objv[1], 0, | | | 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 | AddRef(oPtr); if (objc == 2) { Tcl_Obj *objNameObj = TclOOObjectName(interp, oPtr); Tcl_IncrRefCount(objNameObj); result = TclEvalObjEx(interp, objv[1], 0, ((Interp *) interp)->cmdFramePtr, 1); if (result == TCL_ERROR) { GenerateErrorInfo(interp, oPtr, objNameObj, "class object"); } TclDecrRefCount(objNameObj); } else { result = MagicDefinitionInvoke(interp, nsPtr, 1, objc, objv); } |
︙ | ︙ | |||
1581 1582 1583 1584 1585 1586 1587 | int TclOODefineConstructorObjCmd( TCL_UNUSED(void *), Tcl_Interp *interp, int objc, Tcl_Obj *const *objv) { | < | > > | < < < < < < < < < < < | | 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 | int TclOODefineConstructorObjCmd( TCL_UNUSED(void *), Tcl_Interp *interp, int objc, Tcl_Obj *const *objv) { Class *clsPtr = TclOOGetClassDefineCmdContext(interp); Tcl_Method method; Tcl_Size bodyLength; if (clsPtr == NULL) { return TCL_ERROR; } else if (objc != 3) { Tcl_WrongNumArgs(interp, 1, objv, "arguments body"); return TCL_ERROR; } (void) TclGetStringFromObj(objv[2], &bodyLength); if (bodyLength > 0) { /* * Create the method structure. */ method = (Tcl_Method) TclOONewProcMethod(interp, clsPtr, PUBLIC_METHOD, NULL, objv[1], objv[2], NULL); |
︙ | ︙ | |||
1656 1657 1658 1659 1660 1661 1662 | { static const char *kindList[] = { "-class", "-instance", NULL }; int kind = 0; | | < | < < < < < < < | | 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 | { static const char *kindList[] = { "-class", "-instance", NULL }; int kind = 0; Class *clsPtr = TclOOGetClassDefineCmdContext(interp); Tcl_Namespace *nsPtr; Tcl_Obj *nsNamePtr, **storagePtr; if (clsPtr == NULL) { return TCL_ERROR; } else if (clsPtr->thisPtr->flags & (ROOT_OBJECT | ROOT_CLASS)) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "may not modify the definition namespace of the root classes", -1)); Tcl_SetErrorCode(interp, "TCL", "OO", "MONKEY_BUSINESS", (char *)NULL); return TCL_ERROR; } |
︙ | ︙ | |||
1697 1698 1699 1700 1701 1702 1703 | if (!TclGetString(objv[objc - 1])[0]) { nsNamePtr = NULL; } else { nsPtr = GetNamespaceInOuterContext(interp, objv[objc - 1]); if (nsPtr == NULL) { return TCL_ERROR; } | | | | | 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 | if (!TclGetString(objv[objc - 1])[0]) { nsNamePtr = NULL; } else { nsPtr = GetNamespaceInOuterContext(interp, objv[objc - 1]); if (nsPtr == NULL) { return TCL_ERROR; } nsNamePtr = TclNewNamespaceObj(nsPtr); Tcl_IncrRefCount(nsNamePtr); } /* * Update the correct field of the class definition. */ if (kind) { storagePtr = &clsPtr->objDefinitionNs; } else { storagePtr = &clsPtr->clsDefinitionNs; } if (*storagePtr != NULL) { Tcl_DecrRefCount(*storagePtr); } *storagePtr = nsNamePtr; return TCL_OK; } |
︙ | ︙ | |||
1792 1793 1794 1795 1796 1797 1798 | int TclOODefineDestructorObjCmd( TCL_UNUSED(void *), Tcl_Interp *interp, int objc, Tcl_Obj *const *objv) { | < < > > > | < < < | < < | | 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 | int TclOODefineDestructorObjCmd( TCL_UNUSED(void *), Tcl_Interp *interp, int objc, Tcl_Obj *const *objv) { Tcl_Method method; Tcl_Size bodyLength; Class *clsPtr = TclOOGetClassDefineCmdContext(interp); if (clsPtr == NULL) { return TCL_ERROR; } else if (objc != 2) { Tcl_WrongNumArgs(interp, 1, objv, "body"); return TCL_ERROR; } (void) TclGetStringFromObj(objv[1], &bodyLength); if (bodyLength > 0) { /* * Create the method structure. */ method = (Tcl_Method) TclOONewProcMethod(interp, clsPtr, PUBLIC_METHOD, NULL, NULL, objv[1], NULL); |
︙ | ︙ | |||
1893 1894 1895 1896 1897 1898 1899 | * instance of) then we put in a blank record with that flag; such * records are skipped over by the call chain engine *except* for * their flags member. */ if (isInstanceExport) { if (!oPtr->methodsPtr) { | | > | | | 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 | * instance of) then we put in a blank record with that flag; such * records are skipped over by the call chain engine *except* for * their flags member. */ if (isInstanceExport) { if (!oPtr->methodsPtr) { oPtr->methodsPtr = (Tcl_HashTable *) Tcl_Alloc(sizeof(Tcl_HashTable)); Tcl_InitObjHashTable(oPtr->methodsPtr); oPtr->flags &= ~USE_CLASS_CACHE; } hPtr = Tcl_CreateHashEntry(oPtr->methodsPtr, objv[i], &isNew); } else { hPtr = Tcl_CreateHashEntry(&clsPtr->classMethods, objv[i], &isNew); } if (isNew) { mPtr = (Method *) Tcl_Alloc(sizeof(Method)); memset(mPtr, 0, sizeof(Method)); mPtr->refCount = 1; mPtr->namePtr = objv[i]; Tcl_IncrRefCount(objv[i]); Tcl_SetHashValue(hPtr, mPtr); } else { mPtr = (Method *) Tcl_GetHashValue(hPtr); } if (isNew || !(mPtr->flags & (PUBLIC_METHOD | PRIVATE_METHOD))) { mPtr->flags |= PUBLIC_METHOD; mPtr->flags &= ~TRUE_PRIVATE_METHOD; changed = 1; } } |
︙ | ︙ | |||
2206 2207 2208 2209 2210 2211 2212 | * an instance of) then we put in a blank record without that flag; * such records are skipped over by the call chain engine *except* for * their flags member. */ if (isInstanceUnexport) { if (!oPtr->methodsPtr) { | | > | | | 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 | * an instance of) then we put in a blank record without that flag; * such records are skipped over by the call chain engine *except* for * their flags member. */ if (isInstanceUnexport) { if (!oPtr->methodsPtr) { oPtr->methodsPtr = (Tcl_HashTable *) Tcl_Alloc(sizeof(Tcl_HashTable)); Tcl_InitObjHashTable(oPtr->methodsPtr); oPtr->flags &= ~USE_CLASS_CACHE; } hPtr = Tcl_CreateHashEntry(oPtr->methodsPtr, objv[i], &isNew); } else { hPtr = Tcl_CreateHashEntry(&clsPtr->classMethods, objv[i], &isNew); } if (isNew) { mPtr = (Method *) Tcl_Alloc(sizeof(Method)); memset(mPtr, 0, sizeof(Method)); mPtr->refCount = 1; mPtr->namePtr = objv[i]; Tcl_IncrRefCount(objv[i]); Tcl_SetHashValue(hPtr, mPtr); } else { mPtr = (Method *) Tcl_GetHashValue(hPtr); } if (isNew || mPtr->flags & (PUBLIC_METHOD | TRUE_PRIVATE_METHOD)) { mPtr->flags &= ~(PUBLIC_METHOD | TRUE_PRIVATE_METHOD); changed = 1; } } |
︙ | ︙ | |||
2317 2318 2319 2320 2321 2322 2323 | * ---------------------------------------------------------------------- */ int TclOODefineSlots( Foundation *fPtr) { | | > | | < > > > > | < | > | | | | > | | | | | | | | | > > | < < < < < < < | < | | | > > | < < < < < < < | | | | | > > | < < < < < < < | < | | | > > | < < < < < < < | < | | | | | | > > | < < < < < < < | < | | | > > | | < < < < < < | | 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 | * ---------------------------------------------------------------------- */ int TclOODefineSlots( Foundation *fPtr) { const DeclaredSlot *slotInfoPtr; Tcl_Interp *interp = fPtr->interp; Tcl_Obj *getName, *setName, *resolveName; Tcl_Object object = Tcl_NewObjectInstance(interp, (Tcl_Class) fPtr->classCls, "::oo::Slot", NULL, TCL_INDEX_NONE, NULL, 0); Class *slotCls; if (object == NULL) { return TCL_ERROR; } slotCls = ((Object *) object)->classPtr; if (slotCls == NULL) { return TCL_ERROR; } TclNewLiteralStringObj(getName, "Get"); TclNewLiteralStringObj(setName, "Set"); TclNewLiteralStringObj(resolveName, "Resolve"); for (slotInfoPtr = slots ; slotInfoPtr->name ; slotInfoPtr++) { Tcl_Object slotObject = Tcl_NewObjectInstance(interp, (Tcl_Class) slotCls, slotInfoPtr->name, NULL, TCL_INDEX_NONE, NULL, 0); if (slotObject == NULL) { continue; } TclNewInstanceMethod(interp, slotObject, getName, 0, &slotInfoPtr->getterType, NULL); TclNewInstanceMethod(interp, slotObject, setName, 0, &slotInfoPtr->setterType, NULL); if (slotInfoPtr->resolverType.callProc) { TclNewInstanceMethod(interp, slotObject, resolveName, 0, &slotInfoPtr->resolverType, NULL); } } Tcl_BounceRefCount(getName); Tcl_BounceRefCount(setName); Tcl_BounceRefCount(resolveName); return TCL_OK; } /* * ---------------------------------------------------------------------- * * ClassFilter_Get, ClassFilter_Set -- * * Implementation of the "filter" slot accessors of the "oo::define" * command. * * ---------------------------------------------------------------------- */ static int ClassFilter_Get( TCL_UNUSED(void *), Tcl_Interp *interp, Tcl_ObjectContext context, int objc, Tcl_Obj *const *objv) { Class *clsPtr = TclOOGetClassDefineCmdContext(interp); Tcl_Obj *resultObj, *filterObj; Tcl_Size i; if (clsPtr == NULL) { return TCL_ERROR; } else if (Tcl_ObjectContextSkippedArgs(context) != objc) { Tcl_WrongNumArgs(interp, Tcl_ObjectContextSkippedArgs(context), objv, NULL); return TCL_ERROR; } TclNewObj(resultObj); FOREACH(filterObj, clsPtr->filters) { Tcl_ListObjAppendElement(NULL, resultObj, filterObj); } Tcl_SetObjResult(interp, resultObj); return TCL_OK; } static int ClassFilter_Set( TCL_UNUSED(void *), Tcl_Interp *interp, Tcl_ObjectContext context, int objc, Tcl_Obj *const *objv) { Class *clsPtr = TclOOGetClassDefineCmdContext(interp); Tcl_Size filterc; Tcl_Obj **filterv; if (clsPtr == NULL) { return TCL_ERROR; } else if (Tcl_ObjectContextSkippedArgs(context) + 1 != objc) { Tcl_WrongNumArgs(interp, Tcl_ObjectContextSkippedArgs(context), objv, "filterList"); return TCL_ERROR; } objv += Tcl_ObjectContextSkippedArgs(context); if (TclListObjGetElements(interp, objv[0], &filterc, &filterv) != TCL_OK) { return TCL_ERROR; } TclOOClassSetFilters(interp, clsPtr, filterc, filterv); return TCL_OK; } /* * ---------------------------------------------------------------------- * * ClassMixin_Get, ClassMixin_Set -- * * Implementation of the "mixin" slot accessors of the "oo::define" * command. * * ---------------------------------------------------------------------- */ static int ClassMixin_Get( TCL_UNUSED(void *), Tcl_Interp *interp, Tcl_ObjectContext context, int objc, Tcl_Obj *const *objv) { Class *clsPtr = TclOOGetClassDefineCmdContext(interp); Tcl_Obj *resultObj; Class *mixinPtr; Tcl_Size i; if (clsPtr == NULL) { return TCL_ERROR; } else if (Tcl_ObjectContextSkippedArgs(context) != objc) { Tcl_WrongNumArgs(interp, Tcl_ObjectContextSkippedArgs(context), objv, NULL); return TCL_ERROR; } TclNewObj(resultObj); FOREACH(mixinPtr, clsPtr->mixins) { Tcl_ListObjAppendElement(NULL, resultObj, TclOOObjectName(interp, mixinPtr->thisPtr)); } Tcl_SetObjResult(interp, resultObj); return TCL_OK; } static int ClassMixin_Set( TCL_UNUSED(void *), Tcl_Interp *interp, Tcl_ObjectContext context, int objc, Tcl_Obj *const *objv) { Class *clsPtr = TclOOGetClassDefineCmdContext(interp); Tcl_Size mixinc, i; Tcl_Obj **mixinv; Class **mixins; /* The references to the classes to actually * install. */ Tcl_HashTable uniqueCheck; /* Note that this hash table is just used as a * set of class references; it has no payload * values and keys are always pointers. */ int isNew; if (clsPtr == NULL) { return TCL_ERROR; } else if (Tcl_ObjectContextSkippedArgs(context) + 1 != objc) { Tcl_WrongNumArgs(interp, Tcl_ObjectContextSkippedArgs(context), objv, "mixinList"); return TCL_ERROR; } objv += Tcl_ObjectContextSkippedArgs(context); if (TclListObjGetElements(interp, objv[0], &mixinc, &mixinv) != TCL_OK) { return TCL_ERROR; } mixins = (Class **) TclStackAlloc(interp, sizeof(Class *) * mixinc); Tcl_InitHashTable(&uniqueCheck, TCL_ONE_WORD_KEYS); for (i = 0; i < mixinc; i++) { mixins[i] = GetClassInOuterContext(interp, mixinv[i], "may only mix in classes"); if (mixins[i] == NULL) { i--; goto freeAndError; } (void) Tcl_CreateHashEntry(&uniqueCheck, (void *) mixins[i], &isNew); if (!isNew) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "class should only be a direct mixin once", -1)); Tcl_SetErrorCode(interp, "TCL", "OO", "REPETITIOUS", (char *)NULL); goto freeAndError; } if (TclOOIsReachable(clsPtr, mixins[i])) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "may not mix a class into itself", -1)); Tcl_SetErrorCode(interp, "TCL", "OO", "SELF_MIXIN", (char *)NULL); goto freeAndError; } } TclOOClassSetMixins(interp, clsPtr, mixinc, mixins); Tcl_DeleteHashTable(&uniqueCheck); TclStackFree(interp, mixins); return TCL_OK; freeAndError: Tcl_DeleteHashTable(&uniqueCheck); TclStackFree(interp, mixins); return TCL_ERROR; } /* * ---------------------------------------------------------------------- * * ClassSuper_Get, ClassSuper_Set -- * * Implementation of the "superclass" slot accessors of the "oo::define" * command. * * ---------------------------------------------------------------------- */ static int ClassSuper_Get( TCL_UNUSED(void *), Tcl_Interp *interp, Tcl_ObjectContext context, int objc, Tcl_Obj *const *objv) { Class *clsPtr = TclOOGetClassDefineCmdContext(interp); Tcl_Obj *resultObj; Class *superPtr; Tcl_Size i; if (clsPtr == NULL) { return TCL_ERROR; } else if (Tcl_ObjectContextSkippedArgs(context) != objc) { Tcl_WrongNumArgs(interp, Tcl_ObjectContextSkippedArgs(context), objv, NULL); return TCL_ERROR; } TclNewObj(resultObj); FOREACH(superPtr, clsPtr->superclasses) { Tcl_ListObjAppendElement(NULL, resultObj, TclOOObjectName(interp, superPtr->thisPtr)); } Tcl_SetObjResult(interp, resultObj); return TCL_OK; } static int ClassSuper_Set( TCL_UNUSED(void *), Tcl_Interp *interp, Tcl_ObjectContext context, int objc, Tcl_Obj *const *objv) { Class *clsPtr = TclOOGetClassDefineCmdContext(interp); Tcl_Size superc, j; Tcl_Size i; Tcl_Obj **superv; Class **superclasses, *superPtr; if (clsPtr == NULL) { return TCL_ERROR; } else if (Tcl_ObjectContextSkippedArgs(context) + 1 != objc) { Tcl_WrongNumArgs(interp, Tcl_ObjectContextSkippedArgs(context), objv, "superclassList"); return TCL_ERROR; } objv += Tcl_ObjectContextSkippedArgs(context); Foundation *fPtr = clsPtr->thisPtr->fPtr; if (clsPtr == fPtr->objectCls) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "may not modify the superclass of the root object", -1)); Tcl_SetErrorCode(interp, "TCL", "OO", "MONKEY_BUSINESS", (char *)NULL); return TCL_ERROR; } else if (TclListObjGetElements(interp, objv[0], &superc, &superv) != TCL_OK) { return TCL_ERROR; |
︙ | ︙ | |||
2653 2654 2655 2656 2657 2658 2659 | * Parse the arguments to get the class to use as superclasses. * * Note that zero classes is special, as it is equivalent to just the * class of objects. [Bug 9d61624b3d] */ if (superc == 0) { | | | | | | | 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 | * Parse the arguments to get the class to use as superclasses. * * Note that zero classes is special, as it is equivalent to just the * class of objects. [Bug 9d61624b3d] */ if (superc == 0) { superclasses = (Class **) Tcl_Realloc(superclasses, sizeof(Class *)); if (TclOOIsReachable(fPtr->classCls, clsPtr)) { superclasses[0] = fPtr->classCls; } else { superclasses[0] = fPtr->objectCls; } superc = 1; AddRef(superclasses[0]->thisPtr); } else { for (i = 0; i < superc; i++) { superclasses[i] = GetClassInOuterContext(interp, superv[i], "only a class can be a superclass"); if (superclasses[i] == NULL) { goto failedAfterAlloc; } for (j = 0; j < i; j++) { if (superclasses[j] == superclasses[i]) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "class should only be a direct superclass once", -1)); Tcl_SetErrorCode(interp, "TCL", "OO", "REPETITIOUS",(char *)NULL); goto failedAfterAlloc; } } if (TclOOIsReachable(clsPtr, superclasses[i])) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "attempt to form circular dependency graph", -1)); Tcl_SetErrorCode(interp, "TCL", "OO", "CIRCULARITY", (char *)NULL); failedAfterAlloc: for (; i-- > 0 ;) { TclOODecrRefCount(superclasses[i]->thisPtr); } |
︙ | ︙ | |||
2705 2706 2707 2708 2709 2710 2711 | /* * Install the list of superclasses into the class. Note that this also * involves splicing the class out of the superclasses' subclass list that * it used to be a member of and splicing it into the new superclasses' * subclass list. */ | | | | | | | | | | | | | > > | < < < < < < < < | | | | > > | < < < < < < < | < | 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 | /* * Install the list of superclasses into the class. Note that this also * involves splicing the class out of the superclasses' subclass list that * it used to be a member of and splicing it into the new superclasses' * subclass list. */ if (clsPtr->superclasses.num != 0) { FOREACH(superPtr, clsPtr->superclasses) { TclOORemoveFromSubclasses(clsPtr, superPtr); TclOODecrRefCount(superPtr->thisPtr); } Tcl_Free(clsPtr->superclasses.list); } clsPtr->superclasses.list = superclasses; clsPtr->superclasses.num = superc; FOREACH(superPtr, clsPtr->superclasses) { TclOOAddToSubclasses(clsPtr, superPtr); } BumpGlobalEpoch(interp, clsPtr); return TCL_OK; } /* * ---------------------------------------------------------------------- * * ClassVars_Get, ClassVars_Set -- * * Implementation of the "variable" slot accessors of the "oo::define" * command. * * ---------------------------------------------------------------------- */ static int ClassVars_Get( TCL_UNUSED(void *), Tcl_Interp *interp, Tcl_ObjectContext context, int objc, Tcl_Obj *const *objv) { Class *clsPtr = TclOOGetClassDefineCmdContext(interp); Tcl_Obj *resultObj; Tcl_Size i; if (clsPtr == NULL) { return TCL_ERROR; } else if (Tcl_ObjectContextSkippedArgs(context) != objc) { Tcl_WrongNumArgs(interp, Tcl_ObjectContextSkippedArgs(context), objv, NULL); return TCL_ERROR; } TclNewObj(resultObj); if (IsPrivateDefine(interp)) { PrivateVariableMapping *privatePtr; FOREACH_STRUCT(privatePtr, clsPtr->privateVariables) { Tcl_ListObjAppendElement(NULL, resultObj, privatePtr->variableObj); } } else { Tcl_Obj *variableObj; FOREACH(variableObj, clsPtr->variables) { Tcl_ListObjAppendElement(NULL, resultObj, variableObj); } } Tcl_SetObjResult(interp, resultObj); return TCL_OK; } static int ClassVars_Set( TCL_UNUSED(void *), Tcl_Interp *interp, Tcl_ObjectContext context, int objc, Tcl_Obj *const *objv) { Class *clsPtr = TclOOGetClassDefineCmdContext(interp); Tcl_Size i; Tcl_Size varc; Tcl_Obj **varv; if (clsPtr == NULL) { return TCL_ERROR; } else if (Tcl_ObjectContextSkippedArgs(context) + 1 != objc) { Tcl_WrongNumArgs(interp, Tcl_ObjectContextSkippedArgs(context), objv, "filterList"); return TCL_ERROR; } objv += Tcl_ObjectContextSkippedArgs(context); if (TclListObjGetElements(interp, objv[0], &varc, &varv) != TCL_OK) { return TCL_ERROR; } for (i = 0; i < varc; i++) { const char *varName = TclGetString(varv[i]); if (strstr(varName, "::") != NULL) { |
︙ | ︙ | |||
2829 2830 2831 2832 2833 2834 2835 | varName, "refer to an array element")); Tcl_SetErrorCode(interp, "TCL", "OO", "BAD_DECLVAR", (char *)NULL); return TCL_ERROR; } } if (IsPrivateDefine(interp)) { | | | | | | | 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 | varName, "refer to an array element")); Tcl_SetErrorCode(interp, "TCL", "OO", "BAD_DECLVAR", (char *)NULL); return TCL_ERROR; } } if (IsPrivateDefine(interp)) { InstallPrivateVariableMapping(&clsPtr->privateVariables, varc, varv, clsPtr->thisPtr->creationEpoch); } else { InstallStandardVariableMapping(&clsPtr->variables, varc, varv); } return TCL_OK; } /* * ---------------------------------------------------------------------- * * ObjFilter_Get, ObjFilter_Set -- * * Implementation of the "filter" slot accessors of the "oo::objdefine" * command. * * ---------------------------------------------------------------------- */ static int ObjFilter_Get( TCL_UNUSED(void *), Tcl_Interp *interp, Tcl_ObjectContext context, int objc, Tcl_Obj *const *objv) { Object *oPtr = (Object *) TclOOGetDefineCmdContext(interp); |
︙ | ︙ | |||
2877 2878 2879 2880 2881 2882 2883 | Tcl_ListObjAppendElement(NULL, resultObj, filterObj); } Tcl_SetObjResult(interp, resultObj); return TCL_OK; } static int | | | < | | | 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 | Tcl_ListObjAppendElement(NULL, resultObj, filterObj); } Tcl_SetObjResult(interp, resultObj); return TCL_OK; } static int ObjFilter_Set( TCL_UNUSED(void *), Tcl_Interp *interp, Tcl_ObjectContext context, int objc, Tcl_Obj *const *objv) { Object *oPtr = (Object *) TclOOGetDefineCmdContext(interp); Tcl_Size filterc; Tcl_Obj **filterv; if (Tcl_ObjectContextSkippedArgs(context) + 1 != objc) { Tcl_WrongNumArgs(interp, Tcl_ObjectContextSkippedArgs(context), objv, "filterList"); return TCL_ERROR; } else if (oPtr == NULL) { return TCL_ERROR; } objv += Tcl_ObjectContextSkippedArgs(context); if (TclListObjGetElements(interp, objv[0], &filterc, &filterv) != TCL_OK) { return TCL_ERROR; } TclOOObjectSetFilters(oPtr, filterc, filterv); return TCL_OK; } /* * ---------------------------------------------------------------------- * * ObjMixin_Get, ObjMixin_Set -- * * Implementation of the "mixin" slot accessors of the "oo::objdefine" * command. * * ---------------------------------------------------------------------- */ static int ObjMixin_Get( TCL_UNUSED(void *), Tcl_Interp *interp, Tcl_ObjectContext context, int objc, Tcl_Obj *const *objv) { Object *oPtr = (Object *) TclOOGetDefineCmdContext(interp); |
︙ | ︙ | |||
2949 2950 2951 2952 2953 2954 2955 | } } Tcl_SetObjResult(interp, resultObj); return TCL_OK; } static int | | | 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 | } } Tcl_SetObjResult(interp, resultObj); return TCL_OK; } static int ObjMixin_Set( TCL_UNUSED(void *), Tcl_Interp *interp, Tcl_ObjectContext context, int objc, Tcl_Obj *const *objv) { Object *oPtr = (Object *) TclOOGetDefineCmdContext(interp); |
︙ | ︙ | |||
2974 2975 2976 2977 2978 2979 2980 | Tcl_WrongNumArgs(interp, Tcl_ObjectContextSkippedArgs(context), objv, "mixinList"); return TCL_ERROR; } else if (oPtr == NULL) { return TCL_ERROR; } objv += Tcl_ObjectContextSkippedArgs(context); | | < | | 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 | Tcl_WrongNumArgs(interp, Tcl_ObjectContextSkippedArgs(context), objv, "mixinList"); return TCL_ERROR; } else if (oPtr == NULL) { return TCL_ERROR; } objv += Tcl_ObjectContextSkippedArgs(context); if (TclListObjGetElements(interp, objv[0], &mixinc, &mixinv) != TCL_OK) { return TCL_ERROR; } mixins = (Class **) TclStackAlloc(interp, sizeof(Class *) * mixinc); Tcl_InitHashTable(&uniqueCheck, TCL_ONE_WORD_KEYS); for (i = 0; i < mixinc; i++) { mixins[i] = GetClassInOuterContext(interp, mixinv[i], "may only mix in classes"); if (mixins[i] == NULL) { goto freeAndError; |
︙ | ︙ | |||
3011 3012 3013 3014 3015 3016 3017 | Tcl_DeleteHashTable(&uniqueCheck); return TCL_ERROR; } /* * ---------------------------------------------------------------------- * | | | | 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 | Tcl_DeleteHashTable(&uniqueCheck); return TCL_ERROR; } /* * ---------------------------------------------------------------------- * * ObjVars_Get, ObjVars_Set -- * * Implementation of the "variable" slot accessors of the "oo::objdefine" * command. * * ---------------------------------------------------------------------- */ static int ObjVars_Get( TCL_UNUSED(void *), Tcl_Interp *interp, Tcl_ObjectContext context, int objc, Tcl_Obj *const *objv) { Object *oPtr = (Object *) TclOOGetDefineCmdContext(interp); |
︙ | ︙ | |||
3058 3059 3060 3061 3062 3063 3064 | } } Tcl_SetObjResult(interp, resultObj); return TCL_OK; } static int | | | < | 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 | } } Tcl_SetObjResult(interp, resultObj); return TCL_OK; } static int ObjVars_Set( TCL_UNUSED(void *), Tcl_Interp *interp, Tcl_ObjectContext context, int objc, Tcl_Obj *const *objv) { Object *oPtr = (Object *) TclOOGetDefineCmdContext(interp); Tcl_Size varc, i; Tcl_Obj **varv; if (Tcl_ObjectContextSkippedArgs(context) + 1 != objc) { Tcl_WrongNumArgs(interp, Tcl_ObjectContextSkippedArgs(context), objv, "variableList"); return TCL_ERROR; } else if (oPtr == NULL) { return TCL_ERROR; } objv += Tcl_ObjectContextSkippedArgs(context); if (TclListObjGetElements(interp, objv[0], &varc, &varv) != TCL_OK) { return TCL_ERROR; } for (i = 0; i < varc; i++) { const char *varName = TclGetString(varv[i]); if (strstr(varName, "::") != NULL) { |
︙ | ︙ | |||
3166 3167 3168 3169 3170 3171 3172 | return TCL_OK; } /* * ---------------------------------------------------------------------- * | | > | | | > > | | < < | < | > | > | > < < > > | < < | < | | > | | > | > > | | | < < | < < < | < | < > > > | > | < | < < < | < < < | < | > > > | < < > > | < < < < < < < | < < < < < | | > > > > | > > > | > > > > > > > > > > > | > > > > > > > > > | > | < > > | < | | > | < > > | < > > | > < | < < | | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | < < < < < < < | < < < < < | | < < < < < | | < > > > > > > > > > > > > > > > > > > > > > > > | < < < < < | | | < > | > | > > > | < < > | < | > > > | | > > > > > > > > > > > > > | > > > | | | > > | < > > > > | > | < < < < < < < | < > | > | > > > > > > > > | > | > > | | < > > > > < > | < | > | < > > > | < < | 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 | return TCL_OK; } /* * ---------------------------------------------------------------------- * * Configurable_ClassReadableProps_Get, Configurable_ClassReadableProps_Set, * Configurable_ObjectReadableProps_Get, Configurable_ObjectReadableProps_Set -- * * Implementations of the "readableproperties" slot accessors for classes * and instances. * * ---------------------------------------------------------------------- */ static int Configurable_ClassReadableProps_Get( TCL_UNUSED(void *), Tcl_Interp *interp, Tcl_ObjectContext context, int objc, Tcl_Obj *const *objv) { Class *clsPtr = TclOOGetClassDefineCmdContext(interp); if (clsPtr == NULL) { return TCL_ERROR; } else if (Tcl_ObjectContextSkippedArgs(context) != objc) { Tcl_WrongNumArgs(interp, Tcl_ObjectContextSkippedArgs(context), objv, NULL); return TCL_ERROR; } Tcl_SetObjResult(interp, TclOOGetPropertyList(&clsPtr->properties.readable)); return TCL_OK; } static int Configurable_ClassReadableProps_Set( TCL_UNUSED(void *), Tcl_Interp *interp, Tcl_ObjectContext context, int objc, Tcl_Obj *const *objv) { Class *clsPtr = TclOOGetClassDefineCmdContext(interp); Tcl_Size varc; Tcl_Obj **varv; if (clsPtr == NULL) { return TCL_ERROR; } else if (Tcl_ObjectContextSkippedArgs(context) + 1 != objc) { Tcl_WrongNumArgs(interp, Tcl_ObjectContextSkippedArgs(context), objv, "filterList"); return TCL_ERROR; } objv += Tcl_ObjectContextSkippedArgs(context); if (TclListObjGetElements(interp, objv[0], &varc, &varv) != TCL_OK) { return TCL_ERROR; } TclOOInstallReadableProperties(&clsPtr->properties, varc, varv); BumpGlobalEpoch(interp, clsPtr); return TCL_OK; } static int Configurable_ObjectReadableProps_Get( TCL_UNUSED(void *), Tcl_Interp *interp, Tcl_ObjectContext context, int objc, Tcl_Obj *const *objv) { Object *oPtr = (Object *) TclOOGetDefineCmdContext(interp); if (oPtr == NULL) { return TCL_ERROR; } else if (Tcl_ObjectContextSkippedArgs(context) != objc) { Tcl_WrongNumArgs(interp, Tcl_ObjectContextSkippedArgs(context), objv, NULL); return TCL_ERROR; } Tcl_SetObjResult(interp, TclOOGetPropertyList(&oPtr->properties.readable)); return TCL_OK; } static int Configurable_ObjectReadableProps_Set( TCL_UNUSED(void *), Tcl_Interp *interp, Tcl_ObjectContext context, int objc, Tcl_Obj *const *objv) { Object *oPtr = (Object *) TclOOGetDefineCmdContext(interp); Tcl_Size varc; Tcl_Obj **varv; if (Tcl_ObjectContextSkippedArgs(context) + 1 != objc) { Tcl_WrongNumArgs(interp, Tcl_ObjectContextSkippedArgs(context), objv, "filterList"); return TCL_ERROR; } objv += Tcl_ObjectContextSkippedArgs(context); if (oPtr == NULL) { return TCL_ERROR; } else if (TclListObjGetElements(interp, objv[0], &varc, &varv) != TCL_OK) { return TCL_ERROR; } TclOOInstallReadableProperties(&oPtr->properties, varc, varv); return TCL_OK; } /* * ---------------------------------------------------------------------- * * Configurable_ClassWritableProps_Get, Configurable_ClassWritableProps_Set, * Configurable_ObjectWritableProps_Get, Configurable_ObjectWritableProps_Set -- * * Implementations of the "writableproperties" slot accessors for classes * and instances. * * ---------------------------------------------------------------------- */ static int Configurable_ClassWritableProps_Get( TCL_UNUSED(void *), Tcl_Interp *interp, Tcl_ObjectContext context, int objc, Tcl_Obj *const *objv) { Class *clsPtr = TclOOGetClassDefineCmdContext(interp); if (clsPtr == NULL) { return TCL_ERROR; } else if (Tcl_ObjectContextSkippedArgs(context) != objc) { Tcl_WrongNumArgs(interp, Tcl_ObjectContextSkippedArgs(context), objv, NULL); return TCL_ERROR; } Tcl_SetObjResult(interp, TclOOGetPropertyList(&clsPtr->properties.writable)); return TCL_OK; } static int Configurable_ClassWritableProps_Set( TCL_UNUSED(void *), Tcl_Interp *interp, Tcl_ObjectContext context, int objc, Tcl_Obj *const *objv) { Class *clsPtr = TclOOGetClassDefineCmdContext(interp); Tcl_Size varc; Tcl_Obj **varv; if (clsPtr == NULL) { return TCL_ERROR; } else if (Tcl_ObjectContextSkippedArgs(context) + 1 != objc) { Tcl_WrongNumArgs(interp, Tcl_ObjectContextSkippedArgs(context), objv, "propertyList"); return TCL_ERROR; } objv += Tcl_ObjectContextSkippedArgs(context); if (TclListObjGetElements(interp, objv[0], &varc, &varv) != TCL_OK) { return TCL_ERROR; } TclOOInstallWritableProperties(&clsPtr->properties, varc, varv); BumpGlobalEpoch(interp, clsPtr); return TCL_OK; } static int Configurable_ObjectWritableProps_Get( TCL_UNUSED(void *), Tcl_Interp *interp, Tcl_ObjectContext context, int objc, Tcl_Obj *const *objv) { Object *oPtr = (Object *) TclOOGetDefineCmdContext(interp); if (oPtr == NULL) { return TCL_ERROR; } else if (Tcl_ObjectContextSkippedArgs(context) != objc) { Tcl_WrongNumArgs(interp, Tcl_ObjectContextSkippedArgs(context), objv, NULL); return TCL_ERROR; } Tcl_SetObjResult(interp, TclOOGetPropertyList(&oPtr->properties.writable)); return TCL_OK; } static int Configurable_ObjectWritableProps_Set( TCL_UNUSED(void *), Tcl_Interp *interp, Tcl_ObjectContext context, int objc, Tcl_Obj *const *objv) { Object *oPtr = (Object *) TclOOGetDefineCmdContext(interp); Tcl_Size varc; Tcl_Obj **varv; if (Tcl_ObjectContextSkippedArgs(context) + 1 != objc) { Tcl_WrongNumArgs(interp, Tcl_ObjectContextSkippedArgs(context), objv, "propertyList"); return TCL_ERROR; } objv += Tcl_ObjectContextSkippedArgs(context); if (oPtr == NULL) { return TCL_ERROR; } else if (TclListObjGetElements(interp, objv[0], &varc, &varv) != TCL_OK) { return TCL_ERROR; } TclOOInstallWritableProperties(&oPtr->properties, varc, varv); return TCL_OK; } /* * ---------------------------------------------------------------------- * * TclOORegisterProperty, TclOORegisterInstanceProperty -- * * Helpers to add or remove a name from the property slots of a class or * instance. * * BuildPropertyList -- * * Helper for the helpers. Scans a property list and does the filtering * or adding of the property to add or remove * * ---------------------------------------------------------------------- */ static int BuildPropertyList( PropertyList *propsList, /* Property list to scan. */ Tcl_Obj *propName, /* Property to add/remove. */ int addingProp, /* True if we're adding, false if removing. */ Tcl_Obj *listObj) /* The list of property names we're building */ { int present = 0, changed = 0, i; Tcl_Obj *other; Tcl_SetListObj(listObj, 0, NULL); FOREACH(other, *propsList) { if (!TclStringCmp(propName, other, 1, 0, TCL_INDEX_NONE)) { present = 1; if (!addingProp) { changed = 1; continue; } } Tcl_ListObjAppendElement(NULL, listObj, other); } if (!present && addingProp) { Tcl_ListObjAppendElement(NULL, listObj, propName); changed = 1; } return changed; } void TclOORegisterInstanceProperty( Object *oPtr, /* Object that owns the property slots. */ Tcl_Obj *propName, /* Property to add/remove. Must include the * hyphen if one is desired; this is the value * that is actually placed in the slot. */ int registerReader, /* True if we're adding the property name to * the readable property slot. False if we're * removing the property name from the slot. */ int registerWriter) /* True if we're adding the property name to * the writable property slot. False if we're * removing the property name from the slot. */ { Tcl_Obj *listObj = Tcl_NewObj(); /* Working buffer. */ Tcl_Obj **objv; Tcl_Size count; if (BuildPropertyList(&oPtr->properties.readable, propName, registerReader, listObj)) { TclListObjGetElements(NULL, listObj, &count, &objv); TclOOInstallReadableProperties(&oPtr->properties, count, objv); } if (BuildPropertyList(&oPtr->properties.writable, propName, registerWriter, listObj)) { TclListObjGetElements(NULL, listObj, &count, &objv); TclOOInstallWritableProperties(&oPtr->properties, count, objv); } Tcl_BounceRefCount(listObj); } void TclOORegisterProperty( Class *clsPtr, /* Class that owns the property slots. */ Tcl_Obj *propName, /* Property to add/remove. Must include the * hyphen if one is desired; this is the value * that is actually placed in the slot. */ int registerReader, /* True if we're adding the property name to * the readable property slot. False if we're * removing the property name from the slot. */ int registerWriter) /* True if we're adding the property name to * the writable property slot. False if we're * removing the property name from the slot. */ { Tcl_Obj *listObj = Tcl_NewObj(); /* Working buffer. */ Tcl_Obj **objv; Tcl_Size count; int changed = 0; if (BuildPropertyList(&clsPtr->properties.readable, propName, registerReader, listObj)) { TclListObjGetElements(NULL, listObj, &count, &objv); TclOOInstallReadableProperties(&clsPtr->properties, count, objv); changed = 1; } if (BuildPropertyList(&clsPtr->properties.writable, propName, registerWriter, listObj)) { TclListObjGetElements(NULL, listObj, &count, &objv); TclOOInstallWritableProperties(&clsPtr->properties, count, objv); changed = 1; } Tcl_BounceRefCount(listObj); if (changed) { BumpGlobalEpoch(clsPtr->thisPtr->fPtr->interp, clsPtr); } } /* * Local Variables: * mode: c * c-basic-offset: 4 * fill-column: 78 * End: */ |
Changes to generic/tclOOInfo.c.
︙ | ︙ | |||
12 13 14 15 16 17 18 | #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "tclInt.h" #include "tclOOInt.h" | < < < < | | 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "tclInt.h" #include "tclOOInt.h" static Tcl_ObjCmdProc InfoObjectCallCmd; static Tcl_ObjCmdProc InfoObjectClassCmd; static Tcl_ObjCmdProc InfoObjectDefnCmd; static Tcl_ObjCmdProc InfoObjectFiltersCmd; static Tcl_ObjCmdProc InfoObjectForwardCmd; static Tcl_ObjCmdProc InfoObjectIdCmd; static Tcl_ObjCmdProc InfoObjectIsACmd; static Tcl_ObjCmdProc InfoObjectMethodsCmd; static Tcl_ObjCmdProc InfoObjectMethodTypeCmd; static Tcl_ObjCmdProc InfoObjectMixinsCmd; static Tcl_ObjCmdProc InfoObjectNsCmd; static Tcl_ObjCmdProc InfoObjectVarsCmd; static Tcl_ObjCmdProc InfoObjectVariablesCmd; static Tcl_ObjCmdProc InfoClassCallCmd; static Tcl_ObjCmdProc InfoClassConstrCmd; static Tcl_ObjCmdProc InfoClassDefnCmd; static Tcl_ObjCmdProc InfoClassDefnNsCmd; static Tcl_ObjCmdProc InfoClassDestrCmd; static Tcl_ObjCmdProc InfoClassFiltersCmd; static Tcl_ObjCmdProc InfoClassForwardCmd; static Tcl_ObjCmdProc InfoClassInstancesCmd; static Tcl_ObjCmdProc InfoClassMethodsCmd; static Tcl_ObjCmdProc InfoClassMethodTypeCmd; static Tcl_ObjCmdProc InfoClassMixinsCmd; static Tcl_ObjCmdProc InfoClassSubsCmd; static Tcl_ObjCmdProc InfoClassSupersCmd; static Tcl_ObjCmdProc InfoClassVariablesCmd; /* * List of commands that are used to implement the [info object] subcommands. */ static const EnsembleImplMap infoObjectCmds[] = { {"call", InfoObjectCallCmd, TclCompileBasic2ArgCmd, NULL, NULL, 0}, {"class", InfoObjectClassCmd, TclCompileInfoObjectClassCmd, NULL, NULL, 0}, {"creationid", InfoObjectIdCmd, TclCompileBasic1ArgCmd, NULL, NULL, 0}, {"definition", InfoObjectDefnCmd, TclCompileBasic2ArgCmd, NULL, NULL, 0}, {"filters", InfoObjectFiltersCmd, TclCompileBasic1ArgCmd, NULL, NULL, 0}, {"forward", InfoObjectForwardCmd, TclCompileBasic2ArgCmd, NULL, NULL, 0}, {"isa", InfoObjectIsACmd, TclCompileInfoObjectIsACmd, NULL, NULL, 0}, {"methods", InfoObjectMethodsCmd, TclCompileBasicMin1ArgCmd, NULL, NULL, 0}, {"methodtype", InfoObjectMethodTypeCmd, TclCompileBasic2ArgCmd, NULL, NULL, 0}, {"mixins", InfoObjectMixinsCmd, TclCompileBasic1ArgCmd, NULL, NULL, 0}, {"namespace", InfoObjectNsCmd, TclCompileInfoObjectNamespaceCmd, NULL, NULL, 0}, {"properties", TclOOInfoObjectPropCmd, TclCompileBasicMin1ArgCmd, NULL, NULL, 0}, {"variables", InfoObjectVariablesCmd, TclCompileBasic1Or2ArgCmd, NULL, NULL, 0}, {"vars", InfoObjectVarsCmd, TclCompileBasic1Or2ArgCmd, NULL, NULL, 0}, {NULL, NULL, NULL, NULL, NULL, 0} }; /* * List of commands that are used to implement the [info class] subcommands. |
︙ | ︙ | |||
82 83 84 85 86 87 88 | {"destructor", InfoClassDestrCmd, TclCompileBasic1ArgCmd, NULL, NULL, 0}, {"filters", InfoClassFiltersCmd, TclCompileBasic1ArgCmd, NULL, NULL, 0}, {"forward", InfoClassForwardCmd, TclCompileBasic2ArgCmd, NULL, NULL, 0}, {"instances", InfoClassInstancesCmd, TclCompileBasic1Or2ArgCmd, NULL, NULL, 0}, {"methods", InfoClassMethodsCmd, TclCompileBasicMin1ArgCmd, NULL, NULL, 0}, {"methodtype", InfoClassMethodTypeCmd, TclCompileBasic2ArgCmd, NULL, NULL, 0}, {"mixins", InfoClassMixinsCmd, TclCompileBasic1ArgCmd, NULL, NULL, 0}, | | > > > > > > > > > > > > > > > > > | 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | {"destructor", InfoClassDestrCmd, TclCompileBasic1ArgCmd, NULL, NULL, 0}, {"filters", InfoClassFiltersCmd, TclCompileBasic1ArgCmd, NULL, NULL, 0}, {"forward", InfoClassForwardCmd, TclCompileBasic2ArgCmd, NULL, NULL, 0}, {"instances", InfoClassInstancesCmd, TclCompileBasic1Or2ArgCmd, NULL, NULL, 0}, {"methods", InfoClassMethodsCmd, TclCompileBasicMin1ArgCmd, NULL, NULL, 0}, {"methodtype", InfoClassMethodTypeCmd, TclCompileBasic2ArgCmd, NULL, NULL, 0}, {"mixins", InfoClassMixinsCmd, TclCompileBasic1ArgCmd, NULL, NULL, 0}, {"properties", TclOOInfoClassPropCmd, TclCompileBasicMin1ArgCmd, NULL, NULL, 0}, {"subclasses", InfoClassSubsCmd, TclCompileBasic1Or2ArgCmd, NULL, NULL, 0}, {"superclasses", InfoClassSupersCmd, TclCompileBasic1ArgCmd, NULL, NULL, 0}, {"variables", InfoClassVariablesCmd, TclCompileBasic1Or2ArgCmd, NULL, NULL, 0}, {NULL, NULL, NULL, NULL, NULL, 0} }; /* * ---------------------------------------------------------------------- * * LocalVarName -- * * Get the name of a local variable (especially a method argument) as a * Tcl value. * * ---------------------------------------------------------------------- */ static inline Tcl_Obj * LocalVarName( CompiledLocal *localPtr) { return Tcl_NewStringObj(localPtr->name, TCL_AUTO_LENGTH); } /* * ---------------------------------------------------------------------- * * TclOOInitInfo -- * * Adjusts the Tcl core [info] command to contain subcommands ("object" |
︙ | ︙ | |||
130 131 132 133 134 135 136 | Tcl_SetEnsembleMappingDict(interp, infoCmd, mapDict); } } /* * ---------------------------------------------------------------------- * | | | | | 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 | Tcl_SetEnsembleMappingDict(interp, infoCmd, mapDict); } } /* * ---------------------------------------------------------------------- * * TclOOGetClassFromObj -- * * How to correctly get a class from a Tcl_Obj. Just a wrapper round * Tcl_GetObjectFromObj, but this is an idiom that was used heavily. * * ---------------------------------------------------------------------- */ Class * TclOOGetClassFromObj( Tcl_Interp *interp, Tcl_Obj *objPtr) { Object *oPtr = (Object *) Tcl_GetObjectFromObj(interp, objPtr); if (oPtr == NULL) { return NULL; |
︙ | ︙ | |||
195 196 197 198 199 200 201 | Tcl_SetObjResult(interp, TclOOObjectName(interp, oPtr->selfCls->thisPtr)); return TCL_OK; } else { Class *mixinPtr, *o2clsPtr; Tcl_Size i; | | | 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 | Tcl_SetObjResult(interp, TclOOObjectName(interp, oPtr->selfCls->thisPtr)); return TCL_OK; } else { Class *mixinPtr, *o2clsPtr; Tcl_Size i; o2clsPtr = TclOOGetClassFromObj(interp, objv[2]); if (o2clsPtr == NULL) { return TCL_ERROR; } FOREACH(mixinPtr, oPtr->mixins) { if (!mixinPtr) { continue; |
︙ | ︙ | |||
253 254 255 256 257 258 259 | } if (!oPtr->methodsPtr) { goto unknownMethod; } hPtr = Tcl_FindHashEntry(oPtr->methodsPtr, objv[2]); if (hPtr == NULL) { | | < < < < < | < < < < < > > > > > | < | > > > > > > > > > > > > > > > > > > | 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 | } if (!oPtr->methodsPtr) { goto unknownMethod; } hPtr = Tcl_FindHashEntry(oPtr->methodsPtr, objv[2]); if (hPtr == NULL) { goto unknownMethod; } procPtr = TclOOGetProcFromMethod((Method *) Tcl_GetHashValue(hPtr)); if (procPtr == NULL) { goto wrongType; } /* * We now have the method to describe the definition of. */ TclNewObj(resultObjs[0]); for (localPtr=procPtr->firstLocalPtr; localPtr!=NULL; localPtr=localPtr->nextPtr) { if (TclIsVarArgument(localPtr)) { Tcl_Obj *argObj; TclNewObj(argObj); Tcl_ListObjAppendElement(NULL, argObj, LocalVarName(localPtr)); if (localPtr->defValuePtr != NULL) { Tcl_ListObjAppendElement(NULL, argObj, localPtr->defValuePtr); } Tcl_ListObjAppendElement(NULL, resultObjs[0], argObj); } } resultObjs[1] = TclOOGetMethodBody((Method *) Tcl_GetHashValue(hPtr)); Tcl_SetObjResult(interp, Tcl_NewListObj(2, resultObjs)); return TCL_OK; /* * Errors... */ unknownMethod: Tcl_SetObjResult(interp, Tcl_ObjPrintf( "unknown method \"%s\"", TclGetString(objv[2]))); Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "METHOD", TclGetString(objv[2]), (char *)NULL); return TCL_ERROR; wrongType: Tcl_SetObjResult(interp, Tcl_NewStringObj( "definition not available for this kind of method", -1)); Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "METHOD", TclGetString(objv[2]), (char *)NULL); return TCL_ERROR; } /* * ---------------------------------------------------------------------- * * InfoObjectFiltersCmd -- * |
︙ | ︙ | |||
364 365 366 367 368 369 370 | } if (!oPtr->methodsPtr) { goto unknownMethod; } hPtr = Tcl_FindHashEntry(oPtr->methodsPtr, objv[2]); if (hPtr == NULL) { | > > > > > > > > > > > > > > > > > > | | | | | | | < < > | | | | | | < < < < | 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 | } if (!oPtr->methodsPtr) { goto unknownMethod; } hPtr = Tcl_FindHashEntry(oPtr->methodsPtr, objv[2]); if (hPtr == NULL) { goto unknownMethod; } prefixObj = TclOOGetFwdFromMethod((Method *) Tcl_GetHashValue(hPtr)); if (prefixObj == NULL) { goto wrongType; } /* * Describe the valid forward method. */ Tcl_SetObjResult(interp, prefixObj); return TCL_OK; /* * Errors... */ unknownMethod: Tcl_SetObjResult(interp, Tcl_ObjPrintf( "unknown method \"%s\"", TclGetString(objv[2]))); Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "METHOD", TclGetString(objv[2]), (char *)NULL); return TCL_ERROR; wrongType: Tcl_SetObjResult(interp, Tcl_NewStringObj( "prefix argument list not available for this kind of method", -1)); Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "METHOD", TclGetString(objv[2]), (char *)NULL); return TCL_ERROR; } /* * ---------------------------------------------------------------------- * * InfoObjectIsACmd -- * |
︙ | ︙ | |||
541 542 543 544 545 546 547 548 549 550 551 552 553 554 | "private", "public", "unexported" }; enum Scopes { SCOPE_PRIVATE, SCOPE_PUBLIC, SCOPE_UNEXPORTED, SCOPE_LOCALPRIVATE }; if (objc < 2) { Tcl_WrongNumArgs(interp, 1, objv, "objName ?-option value ...?"); return TCL_ERROR; } oPtr = (Object *) Tcl_GetObjectFromObj(interp, objv[1]); if (oPtr == NULL) { return TCL_ERROR; | > > > > | 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 | "private", "public", "unexported" }; enum Scopes { SCOPE_PRIVATE, SCOPE_PUBLIC, SCOPE_UNEXPORTED, SCOPE_LOCALPRIVATE }; /* * Parse arguments. */ if (objc < 2) { Tcl_WrongNumArgs(interp, 1, objv, "objName ?-option value ...?"); return TCL_ERROR; } oPtr = (Object *) Tcl_GetObjectFromObj(interp, objv[1]); if (oPtr == NULL) { return TCL_ERROR; |
︙ | ︙ | |||
601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 | break; case SCOPE_UNEXPORTED: flag = 0; break; } } TclNewObj(resultObj); if (recurse) { const char **names; int i, numNames = TclOOGetSortedMethodList(oPtr, NULL, NULL, flag, &names); for (i=0 ; i<numNames ; i++) { Tcl_ListObjAppendElement(NULL, resultObj, Tcl_NewStringObj(names[i], -1)); } if (numNames > 0) { | > > > > | | 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 | break; case SCOPE_UNEXPORTED: flag = 0; break; } } /* * List matching methods. */ TclNewObj(resultObj); if (recurse) { const char **names; int i, numNames = TclOOGetSortedMethodList(oPtr, NULL, NULL, flag, &names); for (i=0 ; i<numNames ; i++) { Tcl_ListObjAppendElement(NULL, resultObj, Tcl_NewStringObj(names[i], -1)); } if (numNames > 0) { Tcl_Free((void *) names); } } else if (oPtr->methodsPtr) { if (scope == -1) { /* * Handle legacy-mode matching. [Bug 36e5517a6850] */ int scopeFilter = flag | TRUE_PRIVATE_METHOD; |
︙ | ︙ | |||
674 675 676 677 678 679 680 | } if (!oPtr->methodsPtr) { goto unknownMethod; } hPtr = Tcl_FindHashEntry(oPtr->methodsPtr, objv[2]); if (hPtr == NULL) { | | < < < < < | > > > > > > > | 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 | } if (!oPtr->methodsPtr) { goto unknownMethod; } hPtr = Tcl_FindHashEntry(oPtr->methodsPtr, objv[2]); if (hPtr == NULL) { goto unknownMethod; } mPtr = (Method *) Tcl_GetHashValue(hPtr); if (mPtr->typePtr == NULL) { /* * Special entry for visibility control: pretend the method doesnt * exist. */ goto unknownMethod; } Tcl_SetObjResult(interp, Tcl_NewStringObj(mPtr->typePtr->name, -1)); return TCL_OK; unknownMethod: Tcl_SetObjResult(interp, Tcl_ObjPrintf( "unknown method \"%s\"", TclGetString(objv[2]))); Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "METHOD", TclGetString(objv[2]), (char *)NULL); return TCL_ERROR; } /* * ---------------------------------------------------------------------- * * InfoObjectMixinsCmd -- * |
︙ | ︙ | |||
798 799 800 801 802 803 804 | return TCL_ERROR; } oPtr = (Object *) Tcl_GetObjectFromObj(interp, objv[1]); if (oPtr == NULL) { return TCL_ERROR; } | | < | 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 | return TCL_ERROR; } oPtr = (Object *) Tcl_GetObjectFromObj(interp, objv[1]); if (oPtr == NULL) { return TCL_ERROR; } Tcl_SetObjResult(interp, TclNewNamespaceObj(oPtr->namespacePtr)); return TCL_OK; } /* * ---------------------------------------------------------------------- * * InfoObjectVariablesCmd -- |
︙ | ︙ | |||
831 832 833 834 835 836 837 838 839 840 841 842 843 844 | if (objc != 2 && objc != 3) { Tcl_WrongNumArgs(interp, 1, objv, "objName ?-private?"); return TCL_ERROR; } if (objc == 3) { if (strcmp("-private", TclGetString(objv[2])) != 0) { return TCL_ERROR; } isPrivate = 1; } oPtr = (Object *) Tcl_GetObjectFromObj(interp, objv[1]); if (oPtr == NULL) { return TCL_ERROR; | > > > > | 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 | if (objc != 2 && objc != 3) { Tcl_WrongNumArgs(interp, 1, objv, "objName ?-private?"); return TCL_ERROR; } if (objc == 3) { if (strcmp("-private", TclGetString(objv[2])) != 0) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "option \"%s\" is not exactly \"-private\"", TclGetString(objv[2]))); Tcl_SetErrorCode(interp, "TCL", "OO", "BAD_ARG"); return TCL_ERROR; } isPrivate = 1; } oPtr = (Object *) Tcl_GetObjectFromObj(interp, objv[1]); if (oPtr == NULL) { return TCL_ERROR; |
︙ | ︙ | |||
945 946 947 948 949 950 951 | Tcl_Obj *resultObjs[2]; Class *clsPtr; if (objc != 2) { Tcl_WrongNumArgs(interp, 1, objv, "className"); return TCL_ERROR; } | | | 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 | Tcl_Obj *resultObjs[2]; Class *clsPtr; if (objc != 2) { Tcl_WrongNumArgs(interp, 1, objv, "className"); return TCL_ERROR; } clsPtr = TclOOGetClassFromObj(interp, objv[1]); if (clsPtr == NULL) { return TCL_ERROR; } if (clsPtr->constructorPtr == NULL) { return TCL_OK; } procPtr = TclOOGetProcFromMethod(clsPtr->constructorPtr); |
︙ | ︙ | |||
967 968 969 970 971 972 973 | TclNewObj(resultObjs[0]); for (localPtr=procPtr->firstLocalPtr; localPtr!=NULL; localPtr=localPtr->nextPtr) { if (TclIsVarArgument(localPtr)) { Tcl_Obj *argObj; TclNewObj(argObj); | | < | 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 | TclNewObj(resultObjs[0]); for (localPtr=procPtr->firstLocalPtr; localPtr!=NULL; localPtr=localPtr->nextPtr) { if (TclIsVarArgument(localPtr)) { Tcl_Obj *argObj; TclNewObj(argObj); Tcl_ListObjAppendElement(NULL, argObj, LocalVarName(localPtr)); if (localPtr->defValuePtr != NULL) { Tcl_ListObjAppendElement(NULL, argObj, localPtr->defValuePtr); } Tcl_ListObjAppendElement(NULL, resultObjs[0], argObj); } } resultObjs[1] = TclOOGetMethodBody(clsPtr->constructorPtr); |
︙ | ︙ | |||
1007 1008 1009 1010 1011 1012 1013 | Tcl_Obj *resultObjs[2]; Class *clsPtr; if (objc != 3) { Tcl_WrongNumArgs(interp, 1, objv, "className methodName"); return TCL_ERROR; } | | | | < | | 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 | Tcl_Obj *resultObjs[2]; Class *clsPtr; if (objc != 3) { Tcl_WrongNumArgs(interp, 1, objv, "className methodName"); return TCL_ERROR; } clsPtr = TclOOGetClassFromObj(interp, objv[1]); if (clsPtr == NULL) { return TCL_ERROR; } hPtr = Tcl_FindHashEntry(&clsPtr->classMethods, objv[2]); if (hPtr == NULL) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "unknown method \"%s\"", TclGetString(objv[2]))); Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "METHOD", TclGetString(objv[2]), (char *)NULL); return TCL_ERROR; } procPtr = TclOOGetProcFromMethod((Method *) Tcl_GetHashValue(hPtr)); if (procPtr == NULL) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "definition not available for this kind of method", -1)); Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "METHOD", TclGetString(objv[2]), (char *)NULL); return TCL_ERROR; } TclNewObj(resultObjs[0]); for (localPtr=procPtr->firstLocalPtr; localPtr!=NULL; localPtr=localPtr->nextPtr) { if (TclIsVarArgument(localPtr)) { Tcl_Obj *argObj; TclNewObj(argObj); Tcl_ListObjAppendElement(NULL, argObj, LocalVarName(localPtr)); if (localPtr->defValuePtr != NULL) { Tcl_ListObjAppendElement(NULL, argObj, localPtr->defValuePtr); } Tcl_ListObjAppendElement(NULL, resultObjs[0], argObj); } } resultObjs[1] = TclOOGetMethodBody((Method *) Tcl_GetHashValue(hPtr)); Tcl_SetObjResult(interp, Tcl_NewListObj(2, resultObjs)); return TCL_OK; } /* * ---------------------------------------------------------------------- * |
︙ | ︙ | |||
1078 1079 1080 1081 1082 1083 1084 | Tcl_Obj *nsNamePtr; Class *clsPtr; if (objc != 2 && objc != 3) { Tcl_WrongNumArgs(interp, 1, objv, "className ?kind?"); return TCL_ERROR; } | | | 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 | Tcl_Obj *nsNamePtr; Class *clsPtr; if (objc != 2 && objc != 3) { Tcl_WrongNumArgs(interp, 1, objv, "className ?kind?"); return TCL_ERROR; } clsPtr = TclOOGetClassFromObj(interp, objv[1]); if (clsPtr == NULL) { return TCL_ERROR; } if (objc == 3 && Tcl_GetIndexFromObj(interp, objv[2], kindList, "kind", 0, &kind) != TCL_OK) { return TCL_ERROR; } |
︙ | ︙ | |||
1122 1123 1124 1125 1126 1127 1128 | Proc *procPtr; Class *clsPtr; if (objc != 2) { Tcl_WrongNumArgs(interp, 1, objv, "className"); return TCL_ERROR; } | | | 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 | Proc *procPtr; Class *clsPtr; if (objc != 2) { Tcl_WrongNumArgs(interp, 1, objv, "className"); return TCL_ERROR; } clsPtr = TclOOGetClassFromObj(interp, objv[1]); if (clsPtr == NULL) { return TCL_ERROR; } if (clsPtr->destructorPtr == NULL) { return TCL_OK; } |
︙ | ︙ | |||
1167 1168 1169 1170 1171 1172 1173 | Tcl_Obj *filterObj, *resultObj; Class *clsPtr; if (objc != 2) { Tcl_WrongNumArgs(interp, 1, objv, "className"); return TCL_ERROR; } | | | 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 | Tcl_Obj *filterObj, *resultObj; Class *clsPtr; if (objc != 2) { Tcl_WrongNumArgs(interp, 1, objv, "className"); return TCL_ERROR; } clsPtr = TclOOGetClassFromObj(interp, objv[1]); if (clsPtr == NULL) { return TCL_ERROR; } TclNewObj(resultObj); FOREACH(filterObj, clsPtr->filters) { Tcl_ListObjAppendElement(NULL, resultObj, filterObj); |
︙ | ︙ | |||
1205 1206 1207 1208 1209 1210 1211 | Tcl_Obj *prefixObj; Class *clsPtr; if (objc != 3) { Tcl_WrongNumArgs(interp, 1, objv, "className methodName"); return TCL_ERROR; } | | | | 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 | Tcl_Obj *prefixObj; Class *clsPtr; if (objc != 3) { Tcl_WrongNumArgs(interp, 1, objv, "className methodName"); return TCL_ERROR; } clsPtr = TclOOGetClassFromObj(interp, objv[1]); if (clsPtr == NULL) { return TCL_ERROR; } hPtr = Tcl_FindHashEntry(&clsPtr->classMethods, objv[2]); if (hPtr == NULL) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "unknown method \"%s\"", TclGetString(objv[2]))); Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "METHOD", TclGetString(objv[2]), (char *)NULL); return TCL_ERROR; } prefixObj = TclOOGetFwdFromMethod((Method *) Tcl_GetHashValue(hPtr)); if (prefixObj == NULL) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "prefix argument list not available for this kind of method", -1)); Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "METHOD", TclGetString(objv[2]), (char *)NULL); return TCL_ERROR; |
︙ | ︙ | |||
1258 1259 1260 1261 1262 1263 1264 | const char *pattern = NULL; Tcl_Obj *resultObj; if (objc != 2 && objc != 3) { Tcl_WrongNumArgs(interp, 1, objv, "className ?pattern?"); return TCL_ERROR; } | | | 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 | const char *pattern = NULL; Tcl_Obj *resultObj; if (objc != 2 && objc != 3) { Tcl_WrongNumArgs(interp, 1, objv, "className ?pattern?"); return TCL_ERROR; } clsPtr = TclOOGetClassFromObj(interp, objv[1]); if (clsPtr == NULL) { return TCL_ERROR; } if (objc == 3) { pattern = TclGetString(objv[2]); } |
︙ | ︙ | |||
1317 1318 1319 1320 1321 1322 1323 | SCOPE_PRIVATE, SCOPE_PUBLIC, SCOPE_UNEXPORTED }; if (objc < 2) { Tcl_WrongNumArgs(interp, 1, objv, "className ?-option value ...?"); return TCL_ERROR; } | | | 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 | SCOPE_PRIVATE, SCOPE_PUBLIC, SCOPE_UNEXPORTED }; if (objc < 2) { Tcl_WrongNumArgs(interp, 1, objv, "className ?-option value ...?"); return TCL_ERROR; } clsPtr = TclOOGetClassFromObj(interp, objv[1]); if (clsPtr == NULL) { return TCL_ERROR; } if (objc != 2) { int i; for (i=2 ; i<objc ; i++) { |
︙ | ︙ | |||
1380 1381 1382 1383 1384 1385 1386 | Tcl_Size i, numNames = TclOOGetSortedClassMethodList(clsPtr, flag, &names); for (i=0 ; i<numNames ; i++) { Tcl_ListObjAppendElement(NULL, resultObj, Tcl_NewStringObj(names[i], -1)); } if (numNames > 0) { | | | 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 | Tcl_Size i, numNames = TclOOGetSortedClassMethodList(clsPtr, flag, &names); for (i=0 ; i<numNames ; i++) { Tcl_ListObjAppendElement(NULL, resultObj, Tcl_NewStringObj(names[i], -1)); } if (numNames > 0) { Tcl_Free((void *) names); } } else { FOREACH_HASH_DECLS; if (scope == -1) { /* * Handle legacy-mode matching. [Bug 36e5517a6850] |
︙ | ︙ | |||
1433 1434 1435 1436 1437 1438 1439 | Method *mPtr; Class *clsPtr; if (objc != 3) { Tcl_WrongNumArgs(interp, 1, objv, "className methodName"); return TCL_ERROR; } | | | < < < < < | > > > > > > > | 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 | Method *mPtr; Class *clsPtr; if (objc != 3) { Tcl_WrongNumArgs(interp, 1, objv, "className methodName"); return TCL_ERROR; } clsPtr = TclOOGetClassFromObj(interp, objv[1]); if (clsPtr == NULL) { return TCL_ERROR; } hPtr = Tcl_FindHashEntry(&clsPtr->classMethods, objv[2]); if (hPtr == NULL) { goto unknownMethod; } mPtr = (Method *) Tcl_GetHashValue(hPtr); if (mPtr->typePtr == NULL) { /* * Special entry for visibility control: pretend the method doesnt * exist. */ goto unknownMethod; } Tcl_SetObjResult(interp, Tcl_NewStringObj(mPtr->typePtr->name, -1)); return TCL_OK; unknownMethod: Tcl_SetObjResult(interp, Tcl_ObjPrintf( "unknown method \"%s\"", TclGetString(objv[2]))); Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "METHOD", TclGetString(objv[2]), (char *)NULL); return TCL_ERROR; } /* * ---------------------------------------------------------------------- * * InfoClassMixinsCmd -- * |
︙ | ︙ | |||
1485 1486 1487 1488 1489 1490 1491 | Tcl_Obj *resultObj; Tcl_Size i; if (objc != 2) { Tcl_WrongNumArgs(interp, 1, objv, "className"); return TCL_ERROR; } | | | 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 | Tcl_Obj *resultObj; Tcl_Size i; if (objc != 2) { Tcl_WrongNumArgs(interp, 1, objv, "className"); return TCL_ERROR; } clsPtr = TclOOGetClassFromObj(interp, objv[1]); if (clsPtr == NULL) { return TCL_ERROR; } TclNewObj(resultObj); FOREACH(mixinPtr, clsPtr->mixins) { if (!mixinPtr) { |
︙ | ︙ | |||
1528 1529 1530 1531 1532 1533 1534 | Tcl_Size i; const char *pattern = NULL; if (objc != 2 && objc != 3) { Tcl_WrongNumArgs(interp, 1, objv, "className ?pattern?"); return TCL_ERROR; } | | | 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 | Tcl_Size i; const char *pattern = NULL; if (objc != 2 && objc != 3) { Tcl_WrongNumArgs(interp, 1, objv, "className ?pattern?"); return TCL_ERROR; } clsPtr = TclOOGetClassFromObj(interp, objv[1]); if (clsPtr == NULL) { return TCL_ERROR; } if (objc == 3) { pattern = TclGetString(objv[2]); } |
︙ | ︙ | |||
1582 1583 1584 1585 1586 1587 1588 | Tcl_Obj *resultObj; Tcl_Size i; if (objc != 2) { Tcl_WrongNumArgs(interp, 1, objv, "className"); return TCL_ERROR; } | | | 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 | Tcl_Obj *resultObj; Tcl_Size i; if (objc != 2) { Tcl_WrongNumArgs(interp, 1, objv, "className"); return TCL_ERROR; } clsPtr = TclOOGetClassFromObj(interp, objv[1]); if (clsPtr == NULL) { return TCL_ERROR; } TclNewObj(resultObj); FOREACH(superPtr, clsPtr->superclasses) { Tcl_ListObjAppendElement(NULL, resultObj, |
︙ | ︙ | |||
1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 | if (objc != 2 && objc != 3) { Tcl_WrongNumArgs(interp, 1, objv, "className ?-private?"); return TCL_ERROR; } if (objc == 3) { if (strcmp("-private", TclGetString(objv[2])) != 0) { return TCL_ERROR; } isPrivate = 1; } | > > > > | | 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 | if (objc != 2 && objc != 3) { Tcl_WrongNumArgs(interp, 1, objv, "className ?-private?"); return TCL_ERROR; } if (objc == 3) { if (strcmp("-private", TclGetString(objv[2])) != 0) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "option \"%s\" is not exactly \"-private\"", TclGetString(objv[2]))); Tcl_SetErrorCode(interp, "TCL", "OO", "BAD_ARG"); return TCL_ERROR; } isPrivate = 1; } clsPtr = TclOOGetClassFromObj(interp, objv[1]); if (clsPtr == NULL) { return TCL_ERROR; } TclNewObj(resultObj); if (isPrivate) { PrivateVariableMapping *privatePtr; |
︙ | ︙ | |||
1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 | */ contextPtr = TclOOGetCallContext(oPtr, objv[2], PUBLIC_METHOD, NULL, NULL, NULL); if (contextPtr == NULL) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "cannot construct any call chain", -1)); return TCL_ERROR; } Tcl_SetObjResult(interp, TclOORenderCallChain(interp, contextPtr->callPtr)); TclOODeleteContext(contextPtr); return TCL_OK; } | > | 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 | */ contextPtr = TclOOGetCallContext(oPtr, objv[2], PUBLIC_METHOD, NULL, NULL, NULL); if (contextPtr == NULL) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "cannot construct any call chain", -1)); Tcl_SetErrorCode(interp, "TCL", "OO", "BAD_CALL_CHAIN"); return TCL_ERROR; } Tcl_SetObjResult(interp, TclOORenderCallChain(interp, contextPtr->callPtr)); TclOODeleteContext(contextPtr); return TCL_OK; } |
︙ | ︙ | |||
1721 1722 1723 1724 1725 1726 1727 | Class *clsPtr; CallChain *callPtr; if (objc != 3) { Tcl_WrongNumArgs(interp, 1, objv, "className methodName"); return TCL_ERROR; } | | > < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 | Class *clsPtr; CallChain *callPtr; if (objc != 3) { Tcl_WrongNumArgs(interp, 1, objv, "className methodName"); return TCL_ERROR; } clsPtr = TclOOGetClassFromObj(interp, objv[1]); if (clsPtr == NULL) { return TCL_ERROR; } /* * Get an render the stereotypical call chain. */ callPtr = TclOOGetStereotypeCallChain(clsPtr, objv[2], PUBLIC_METHOD); if (callPtr == NULL) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "cannot construct any call chain", -1)); Tcl_SetErrorCode(interp, "TCL", "OO", "BAD_CALL_CHAIN"); return TCL_ERROR; } Tcl_SetObjResult(interp, TclOORenderCallChain(interp, callPtr)); TclOODeleteChain(callPtr); return TCL_OK; } /* * Local Variables: * mode: c * c-basic-offset: 4 * fill-column: 78 * End: */ |
Changes to generic/tclOOInt.h.
︙ | ︙ | |||
26 27 28 29 30 31 32 | #define Object TclOOObject #endif /* __OBJC__ */ /* * Forward declarations. */ | | > | > > | > > | > > > < | > | > | | > > > | < | < | | < | | | 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | #define Object TclOOObject #endif /* __OBJC__ */ /* * Forward declarations. */ typedef struct CallChain CallChain; typedef struct CallContext CallContext; typedef struct Class Class; typedef struct DeclaredClassMethod DeclaredClassMethod; typedef struct ForwardMethod ForwardMethod; typedef struct Foundation Foundation; typedef struct Method Method; typedef struct MInvoke MInvoke; typedef struct Object Object; typedef struct PrivateVariableMapping PrivateVariableMapping; typedef struct ProcedureMethod ProcedureMethod; typedef struct PropertyStorage PropertyStorage; /* * The data that needs to be stored per method. This record is used to collect * information about all sorts of methods, including forwards, constructors * and destructors. */ struct Method { union { const Tcl_MethodType *typePtr; const Tcl_MethodType2 *type2Ptr; }; /* The type of method. If NULL, this is a * special flag record which is just used for * the setting of the flags field. Note that * this is a union of two pointer types that * have the same layout at least as far as the * internal version field. */ Tcl_Size refCount; void *clientData; /* Type-specific data. */ Tcl_Obj *namePtr; /* Name of the method. */ Object *declaringObjectPtr; /* The object that declares this method, or * NULL if it was declared by a class. */ Class *declaringClassPtr; /* The class that declares this method, or * NULL if it was declared directly on an * object. */ int flags; /* Assorted flags. Includes whether this * method is public/exported or not. */ }; /* * Pre- and post-call callbacks, to allow procedure-like methods to be fine * tuned in their behaviour. */ typedef int (TclOO_PreCallProc)(void *clientData, Tcl_Interp *interp, Tcl_ObjectContext context, Tcl_CallFrame *framePtr, int *isFinished); typedef int (TclOO_PostCallProc)(void *clientData, Tcl_Interp *interp, Tcl_ObjectContext context, Tcl_Namespace *namespacePtr, int result); typedef void (TclOO_PmCDDeleteProc)(void *clientData); typedef void *(TclOO_PmCDCloneProc)(void *clientData); /* * Procedure-like methods have the following extra information. */ struct ProcedureMethod { int version; /* Version of this structure. Currently must * be TCLOO_PROCEDURE_METHOD_VERSION_1. */ Proc *procPtr; /* Core of the implementation of the method; * includes the argument definition and the * body bytecodes. */ int flags; /* Flags to control features. */ Tcl_Size refCount; void *clientData; TclOO_PmCDDeleteProc *deleteClientdataProc; |
︙ | ︙ | |||
103 104 105 106 107 108 109 | * the method. */ Tcl_Method method; /* Method to compute the name of. */ int callSiteFlags; /* Flags from the call chain. Only interested * in whether this is a constructor or * destructor, which we can't know until then * for messy reasons. Other flags are variable * but not used. */ | | > > > | > > | | > | > | | | < | < < | | | < | | 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 | * the method. */ Tcl_Method method; /* Method to compute the name of. */ int callSiteFlags; /* Flags from the call chain. Only interested * in whether this is a constructor or * destructor, which we can't know until then * for messy reasons. Other flags are variable * but not used. */ }; enum ProcedureMethodVersion { TCLOO_PROCEDURE_METHOD_VERSION_1 = 0 }; #define TCLOO_PROCEDURE_METHOD_VERSION TCLOO_PROCEDURE_METHOD_VERSION_1 /* * Flags for use in a ProcedureMethod. * */ enum ProceudreMethodFlags { USE_DECLARER_NS = 0x80 /* When set, the method will use the namespace * of the object or class that declared it (or * the clone of it, if it was from such that * the implementation of the method came to the * particular use) instead of the namespace of * the object on which the method was invoked. * This flag must be distinct from all others * that are associated with methods. */ }; /* * Forwarded methods have the following extra information. */ struct ForwardMethod { Tcl_Obj *prefixObj; /* The list of values to use to replace the * object and method name with. Will be a * non-empty list. */ }; /* * Structure used in private variable mappings. Describes the mapping of a * single variable from the user's local name to the system's storage name. * [TIP #500] */ struct PrivateVariableMapping { Tcl_Obj *variableObj; /* Name used within methods. This is the part * that is properly under user control. */ Tcl_Obj *fullNameObj; /* Name used at the instance namespace level. */ }; /* * Helper definitions that declare a "list" array. The two varieties are * either optimized for simplicity (in the case that the whole array is * typically assigned at once) or efficiency (in the case that the array is * expected to be expanded over time). These lists are designed to be iterated * over with the help of the FOREACH macro (see later in this file). |
︙ | ︙ | |||
163 164 165 166 167 168 169 170 171 172 173 | #define LIST_DYNAMIC(listType_t) \ struct { Tcl_Size num, size; listType_t *list; } /* * These types are needed in function arguments. */ typedef LIST_STATIC(Tcl_Obj *) VariableNameList; typedef LIST_STATIC(PrivateVariableMapping) PrivateVariableList; /* | > > > > > | > < | < | < | | | | < < | | < | < | | | | | | 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 | #define LIST_DYNAMIC(listType_t) \ struct { Tcl_Size num, size; listType_t *list; } /* * These types are needed in function arguments. */ typedef LIST_STATIC(Class *) ClassList; typedef LIST_DYNAMIC(Class *) VarClassList; typedef LIST_STATIC(Tcl_Obj *) FilterList; typedef LIST_DYNAMIC(Object *) ObjectList; typedef LIST_STATIC(Tcl_Obj *) VariableNameList; typedef LIST_STATIC(PrivateVariableMapping) PrivateVariableList; typedef LIST_STATIC(Tcl_Obj *) PropertyList; /* * This type is used in various places. It holds the parts of an object or * class relating to property information. */ struct PropertyStorage { PropertyList readable; /* The readable properties slot. */ PropertyList writable; /* The writable properties slot. */ Tcl_Obj *allReadableCache; /* The cache of all readable properties * exposed by this object or class (in its * stereotypical instancs). Contains a sorted * unique list if not NULL. */ Tcl_Obj *allWritableCache; /* The cache of all writable properties * exposed by this object or class (in its * stereotypical instances). Contains a sorted * unique list if not NULL. */ int epoch; /* The epoch that the caches are valid for. */ }; /* * Now, the definition of what an object actually is. */ struct Object { Foundation *fPtr; /* The basis for the object system, which is * conceptually part of the interpreter. */ Tcl_Namespace *namespacePtr;/* This object's namespace. */ Tcl_Command command; /* Reference to this object's public * command. */ Tcl_Command myCommand; /* Reference to this object's internal * command. */ Class *selfCls; /* This object's class. */ Tcl_HashTable *methodsPtr; /* Object-local Tcl_Obj (method name) to * Method* mapping. */ ClassList mixins; /* Classes mixed into this object. */ FilterList filters; /* List of filter names. */ Class *classPtr; /* This is non-NULL for all classes, and NULL * for everything else. It points to the class * structure. */ Tcl_Size refCount; /* Number of strong references to this object. * Note that there may be many more weak * references; this mechanism exists to * avoid Tcl_Preserve. */ int flags; /* See ObjectFlags. */ Tcl_Size creationEpoch; /* Unique value to make comparisons of objects * easier. */ Tcl_Size epoch; /* Per-object epoch, incremented when the way * an object should resolve call chains is * changed. */ Tcl_HashTable *metadataPtr; /* Mapping from pointers to metadata type to * the void *values that are the values * of each piece of attached metadata. This * field starts out as NULL and is only * allocated if metadata is attached. */ |
︙ | ︙ | |||
240 241 242 243 244 245 246 | /* Configurations for the variable resolver * used inside methods. */ Tcl_Command myclassCommand; /* Reference to this object's class dispatcher * command. */ PropertyStorage properties; /* Information relating to the lists of * properties that this object *claims* to * support. */ | | > | | < | | | | | | | > | < | < | < | < | < | < | | | | 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 | /* Configurations for the variable resolver * used inside methods. */ Tcl_Command myclassCommand; /* Reference to this object's class dispatcher * command. */ PropertyStorage properties; /* Information relating to the lists of * properties that this object *claims* to * support. */ }; enum ObjectFlags { OBJECT_DESTRUCTING = 1, /* Indicates that an object is being or has * been destroyed */ DESTRUCTOR_CALLED = 2, /* Indicates that evaluation of destructor * script for the object has began */ ROOT_OBJECT = 0x1000, /* Flag to say that this object is the root of * the class hierarchy and should be treated * specially during teardown. */ FILTER_HANDLING = 0x2000, /* Flag set when the object is processing a * filter; when set, filters are *not* * processed on the object, preventing nasty * recursive filtering problems. */ USE_CLASS_CACHE = 0x4000, /* Flag set to say that the object is a pure * instance of the class, and has had nothing * added that changes the dispatch chain (i.e. * no methods, mixins, or filters. */ ROOT_CLASS = 0x8000, /* Flag to say that this object is the root * class of classes, and should be treated * specially during teardown (and in a few * other spots). */ FORCE_UNKNOWN = 0x10000, /* States that we are *really* looking up the * unknown method handler at that point. */ DONT_DELETE = 0x20000, /* Inhibit deletion of this object. Used * during fundamental object type mutation to * make sure that the object actually survives * to the end of the operation. */ HAS_PRIVATE_METHODS = 0x40000 /* Object/class has (or had) private methods, * and so shouldn't be cached so * aggressively. */ }; /* * And the definition of a class. Note that every class also has an associated * object, through which it is manipulated. */ struct Class { Object *thisPtr; /* Reference to the object associated with * this class. */ int flags; /* Assorted flags. */ ClassList superclasses; /* List of superclasses, used for generation * of method call chains. */ VarClassList subclasses; /* List of subclasses, used to ensure deletion * of dependent entities happens properly when * the class itself is deleted. */ ObjectList instances; /* List of instances, used to ensure deletion * of dependent entities happens properly when * the class itself is deleted. */ FilterList filters; /* List of filter names, used for generation * of method call chains. */ ClassList mixins; /* List of mixin classes, used for generation * of method call chains. */ VarClassList mixinSubs; /* List of classes that this class is mixed * into, used to ensure deletion of dependent * entities happens properly when the class * itself is deleted. */ Tcl_HashTable classMethods; /* Hash table of all methods. Hash maps from * the (Tcl_Obj*) method name to the (Method*) * method record. */ Method *constructorPtr; /* Method record of the class constructor (if * any). */ Method *destructorPtr; /* Method record of the class destructor (if * any). */ Tcl_HashTable *metadataPtr; /* Mapping from pointers to metadata type to * the void *values that are the values * of each piece of attached metadata. This * field starts out as NULL and is only * allocated if metadata is attached. */ CallChain *constructorChainPtr; CallChain *destructorChainPtr; Tcl_HashTable *classChainCache; /* Places where call chains are stored. For * constructors, the class chain is always * used. For destructors and ordinary methods, * the class chain is only used when the * object doesn't override with its own mixins * (and filters and method implementations for |
︙ | ︙ | |||
351 352 353 354 355 356 357 | * [oo::objdefine]/[self] call time if this * namespace is defined but doesn't exist; we * also check at setting time but don't check * between times. */ PropertyStorage properties; /* Information relating to the lists of * properties that this class *claims* to * support. */ | | | < < | < > > > > > > | | < < < < < < < < > | < < < | > < > > > > > > > | | | | > > > > > > | | | | | | | | < | > | < | | > > > > | | | 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 | * [oo::objdefine]/[self] call time if this * namespace is defined but doesn't exist; we * also check at setting time but don't check * between times. */ PropertyStorage properties; /* Information relating to the lists of * properties that this class *claims* to * support. */ }; /* * Master epoch counter for making unique IDs for objects that can be compared * cheaply. */ typedef struct ThreadLocalData { Tcl_Size nsCount; /* Epoch counter is used for keeping * the values used in Tcl_Obj internal * representations sane. Must be thread-local * because Tcl_Objs can cross interpreter * boundaries within a thread (objects don't * generally cross threads). */ } ThreadLocalData; /* * The foundation of the object system within an interpreter contains * references to the key classes and namespaces, together with a few other * useful bits and pieces. Probably ought to eventually go in the Interp * structure itself. */ struct Foundation { Tcl_Interp *interp; /* The interpreter this is attached to. */ Class *objectCls; /* The root of the object system. */ Class *classCls; /* The class of all classes. */ Tcl_Namespace *ooNs; /* ::oo namespace. */ Tcl_Namespace *helpersNs; /* Namespace containing the commands that are * only valid when executing inside a * procedural method. */ Tcl_Size epoch; /* Used to invalidate method chains when the * class structure changes. */ ThreadLocalData *tsdPtr; /* Counter so we can allocate a unique * namespace to each object. */ Tcl_Obj *unknownMethodNameObj; /* Shared object containing the name of the * unknown method handler method. */ Tcl_Obj *constructorName; /* Shared object containing the "name" of a * constructor. */ Tcl_Obj *destructorName; /* Shared object containing the "name" of a * destructor. */ Tcl_Obj *clonedName; /* Shared object containing the name of a * "<cloned>" pseudo-constructor. */ Tcl_Obj *defineName; /* Fully qualified name of oo::define. */ Tcl_Obj *myName; /* The "my" shared object. */ }; /* * The number of MInvoke records in the CallChain before we allocate * separately. */ #define CALL_CHAIN_STATIC_SIZE 4 /* * Information relating to the invocation of a particular method implementation * in a call chain. */ struct MInvoke { Method *mPtr; /* Reference to the method implementation * record. */ int isFilter; /* Whether this is a filter invocation. */ Class *filterDeclarer; /* What class decided to add the filter; if * NULL, it was added by the object. */ }; /* * The cacheable part of a call context. */ struct CallChain { Tcl_Size objectCreationEpoch;/* The object's creation epoch. Note that the * object reference is not stored in the call * chain; it is in the call context. */ Tcl_Size objectEpoch; /* Local (object structure) epoch counter * snapshot. */ Tcl_Size epoch; /* Global (class structure) epoch counter * snapshot. */ int flags; /* Assorted flags, see below. */ Tcl_Size refCount; /* Reference count. */ Tcl_Size numChain; /* Size of the call chain. */ MInvoke *chain; /* Array of call chain entries. May point to * staticChain if the number of entries is * small. */ MInvoke staticChain[CALL_CHAIN_STATIC_SIZE]; }; /* * A call context structure is built when a method is called. It contains the * chain of method implementations that are to be invoked by a particular * call, and the process of calling walks the chain, with the [next] command * proceeding to the next entry in the chain. */ struct CallContext { Object *oPtr; /* The object associated with this call. */ Tcl_Size index; /* Index into the call chain of the currently * executing method implementation. */ Tcl_Size skip; /* Current number of arguments to skip; can * vary depending on whether it is a direct * method call or a continuation via the * [next] command. */ CallChain *callPtr; /* The actual call chain. */ }; /* * Bits for the 'flags' field of the call chain. */ enum TclOOCallChainFlags { PUBLIC_METHOD = 0x01, /* This is a public (exported) method. */ PRIVATE_METHOD = 0x02, /* This is a private (class's direct instances * only) method. Supports itcl. */ OO_UNKNOWN_METHOD = 0x04, /* This is an unknown method. */ CONSTRUCTOR = 0x08, /* This is a constructor. */ DESTRUCTOR = 0x10, /* This is a destructor. */ TRUE_PRIVATE_METHOD = 0x20 /* This is a private method only accessible * from other methods defined on this class * or instance. [TIP #500] */ }; #define SCOPE_FLAGS (PUBLIC_METHOD | PRIVATE_METHOD | TRUE_PRIVATE_METHOD) /* * Structure containing definition information about basic class methods. */ struct DeclaredClassMethod { const char *name; /* Name of the method in question. */ int isPublic; /* Whether the method is public by default. */ Tcl_MethodType definition; /* How to call the method. */ }; /* *---------------------------------------------------------------- * Commands relating to OO support. *---------------------------------------------------------------- */ MODULE_SCOPE int TclOOInit(Tcl_Interp *interp); MODULE_SCOPE Tcl_ObjCmdProc TclOODefineObjCmd; MODULE_SCOPE Tcl_ObjCmdProc TclOOObjDefObjCmd; MODULE_SCOPE Tcl_ObjCmdProc TclOODefineConstructorObjCmd; MODULE_SCOPE Tcl_ObjCmdProc TclOODefineDefnNsObjCmd; MODULE_SCOPE Tcl_ObjCmdProc TclOODefineDeleteMethodObjCmd; MODULE_SCOPE Tcl_ObjCmdProc TclOODefineDestructorObjCmd; MODULE_SCOPE Tcl_ObjCmdProc TclOODefineExportObjCmd; MODULE_SCOPE Tcl_ObjCmdProc TclOODefineForwardObjCmd; MODULE_SCOPE Tcl_ObjCmdProc TclOODefineMethodObjCmd; MODULE_SCOPE Tcl_ObjCmdProc TclOODefineRenameMethodObjCmd; MODULE_SCOPE Tcl_ObjCmdProc TclOODefineUnexportObjCmd; MODULE_SCOPE Tcl_ObjCmdProc TclOODefineClassObjCmd; MODULE_SCOPE Tcl_ObjCmdProc TclOODefineSelfObjCmd; MODULE_SCOPE Tcl_ObjCmdProc TclOODefineObjSelfObjCmd; MODULE_SCOPE Tcl_ObjCmdProc TclOODefinePrivateObjCmd; MODULE_SCOPE Tcl_ObjCmdProc TclOODefinePropertyCmd; MODULE_SCOPE Tcl_ObjCmdProc TclOOUnknownDefinition; MODULE_SCOPE Tcl_ObjCmdProc TclOOCopyObjectCmd; MODULE_SCOPE Tcl_ObjCmdProc TclOONextObjCmd; MODULE_SCOPE Tcl_ObjCmdProc TclOONextToObjCmd; MODULE_SCOPE Tcl_ObjCmdProc TclOOSelfObjCmd; MODULE_SCOPE Tcl_ObjCmdProc TclOOInfoObjectPropCmd; MODULE_SCOPE Tcl_ObjCmdProc TclOOInfoClassPropCmd; /* * Method implementations (in tclOOBasic.c). */ MODULE_SCOPE Tcl_MethodCallProc TclOO_Class_Constructor; MODULE_SCOPE Tcl_MethodCallProc TclOO_Class_Create; MODULE_SCOPE Tcl_MethodCallProc TclOO_Class_CreateNs; MODULE_SCOPE Tcl_MethodCallProc TclOO_Class_New; MODULE_SCOPE Tcl_MethodCallProc TclOO_Object_Destroy; MODULE_SCOPE Tcl_MethodCallProc TclOO_Object_Eval; MODULE_SCOPE Tcl_MethodCallProc TclOO_Object_LinkVar; MODULE_SCOPE Tcl_MethodCallProc TclOO_Object_Unknown; MODULE_SCOPE Tcl_MethodCallProc TclOO_Object_VarName; MODULE_SCOPE Tcl_MethodCallProc TclOO_Configurable_Configure; /* * Private definitions, some of which perhaps ought to be exposed properly or * maybe just put in the internal stubs table. */ MODULE_SCOPE void TclOOAddToInstances(Object *oPtr, Class *clsPtr); MODULE_SCOPE void TclOOAddToMixinSubs(Class *subPtr, Class *mixinPtr); MODULE_SCOPE void TclOOAddToSubclasses(Class *subPtr, Class *superPtr); MODULE_SCOPE Class * TclOOAllocClass(Tcl_Interp *interp, Object *useThisObj); MODULE_SCOPE int TclMethodIsType(Tcl_Method method, const Tcl_MethodType *typePtr, void **clientDataPtr); MODULE_SCOPE Tcl_Method TclNewInstanceMethod(Tcl_Interp *interp, Tcl_Object object, Tcl_Obj *nameObj, int flags, const Tcl_MethodType *typePtr, void *clientData); MODULE_SCOPE Tcl_Method TclNewMethod(Tcl_Class cls, Tcl_Obj *nameObj, int flags, const Tcl_MethodType *typePtr, void *clientData); MODULE_SCOPE int TclNRNewObjectInstance(Tcl_Interp *interp, Tcl_Class cls, const char *nameStr, const char *nsNameStr, Tcl_Size objc, Tcl_Obj *const *objv, Tcl_Size skip, |
︙ | ︙ | |||
553 554 555 556 557 558 559 | MODULE_SCOPE int TclOODefineSlots(Foundation *fPtr); MODULE_SCOPE void TclOODeleteChain(CallChain *callPtr); MODULE_SCOPE void TclOODeleteChainCache(Tcl_HashTable *tablePtr); MODULE_SCOPE void TclOODeleteContext(CallContext *contextPtr); MODULE_SCOPE void TclOODeleteDescendants(Tcl_Interp *interp, Object *oPtr); MODULE_SCOPE void TclOODelMethodRef(Method *method); | < < < < > > > > > > | > > > > > > > > > > > > > > > | 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 | MODULE_SCOPE int TclOODefineSlots(Foundation *fPtr); MODULE_SCOPE void TclOODeleteChain(CallChain *callPtr); MODULE_SCOPE void TclOODeleteChainCache(Tcl_HashTable *tablePtr); MODULE_SCOPE void TclOODeleteContext(CallContext *contextPtr); MODULE_SCOPE void TclOODeleteDescendants(Tcl_Interp *interp, Object *oPtr); MODULE_SCOPE void TclOODelMethodRef(Method *method); MODULE_SCOPE CallContext *TclOOGetCallContext(Object *oPtr, Tcl_Obj *methodNameObj, int flags, Object *contextObjPtr, Class *contextClsPtr, Tcl_Obj *cacheInThisObj); MODULE_SCOPE Class * TclOOGetClassDefineCmdContext(Tcl_Interp *interp); MODULE_SCOPE Class * TclOOGetClassFromObj(Tcl_Interp *interp, Tcl_Obj *objPtr); MODULE_SCOPE Tcl_Namespace *TclOOGetDefineContextNamespace( Tcl_Interp *interp, Object *oPtr, int forClass); MODULE_SCOPE CallChain *TclOOGetStereotypeCallChain(Class *clsPtr, Tcl_Obj *methodNameObj, int flags); MODULE_SCOPE Foundation *TclOOGetFoundation(Tcl_Interp *interp); MODULE_SCOPE Tcl_Obj * TclOOGetFwdFromMethod(Method *mPtr); MODULE_SCOPE Proc * TclOOGetProcFromMethod(Method *mPtr); MODULE_SCOPE Tcl_Obj * TclOOGetMethodBody(Method *mPtr); MODULE_SCOPE size_t TclOOGetSortedClassMethodList(Class *clsPtr, int flags, const char ***stringsPtr); MODULE_SCOPE int TclOOGetSortedMethodList(Object *oPtr, Object *contextObj, Class *contextCls, int flags, const char ***stringsPtr); MODULE_SCOPE int TclOOInit(Tcl_Interp *interp); MODULE_SCOPE void TclOOInitInfo(Tcl_Interp *interp); MODULE_SCOPE int TclOOInvokeContext(void *clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); MODULE_SCOPE Tcl_Var TclOOLookupObjectVar(Tcl_Interp *interp, Tcl_Object object, Tcl_Obj *varName, Tcl_Var *aryPtr); MODULE_SCOPE int TclNRObjectContextInvokeNext(Tcl_Interp *interp, Tcl_ObjectContext context, Tcl_Size objc, Tcl_Obj *const *objv, Tcl_Size skip); MODULE_SCOPE void TclOONewBasicMethod(Class *clsPtr, const DeclaredClassMethod *dcm); MODULE_SCOPE Tcl_Obj * TclOOObjectName(Tcl_Interp *interp, Object *oPtr); MODULE_SCOPE void TclOOReleaseClassContents(Tcl_Interp *interp, Object *oPtr); MODULE_SCOPE int TclOORemoveFromInstances(Object *oPtr, Class *clsPtr); MODULE_SCOPE int TclOORemoveFromMixins(Class *mixinPtr, Object *oPtr); MODULE_SCOPE int TclOORemoveFromMixinSubs(Class *subPtr, Class *mixinPtr); MODULE_SCOPE int TclOORemoveFromSubclasses(Class *subPtr, Class *superPtr); MODULE_SCOPE Tcl_Obj * TclOORenderCallChain(Tcl_Interp *interp, CallChain *callPtr); MODULE_SCOPE void TclOOStashContext(Tcl_Obj *objPtr, CallContext *contextPtr); MODULE_SCOPE Tcl_Obj * TclOOGetAllObjectProperties(Object *oPtr, int writable); MODULE_SCOPE void TclOOSetupVariableResolver(Tcl_Namespace *nsPtr); MODULE_SCOPE Tcl_Obj * TclOOGetPropertyList(PropertyList *propList); MODULE_SCOPE void TclOOReleasePropertyStorage(PropertyStorage *propsPtr); MODULE_SCOPE void TclOOInstallReadableProperties(PropertyStorage *props, Tcl_Size objc, Tcl_Obj *const objv[]); MODULE_SCOPE void TclOOInstallWritableProperties(PropertyStorage *props, Tcl_Size objc, Tcl_Obj *const objv[]); MODULE_SCOPE int TclOOInstallStdPropertyImpls(void *useInstance, Tcl_Interp *interp, Tcl_Obj *propName, int readable, int writable); MODULE_SCOPE void TclOORegisterProperty(Class *clsPtr, Tcl_Obj *propName, int mayRead, int mayWrite); MODULE_SCOPE void TclOORegisterInstanceProperty(Object *oPtr, Tcl_Obj *propName, int mayRead, int mayWrite); /* * Include all the private API, generated from tclOO.decls. */ #include "tclOOIntDecls.h" |
︙ | ︙ |
Changes to generic/tclOOMethod.c.
︙ | ︙ | |||
17 18 19 20 21 22 23 | #include "tclCompile.h" /* * Structure used to contain all the information needed about a call frame * used in a procedure-like method. */ | | | | 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | #include "tclCompile.h" /* * Structure used to contain all the information needed about a call frame * used in a procedure-like method. */ typedef struct PMFrameData { CallFrame *framePtr; /* Reference to the call frame itself (it's * actually allocated on the Tcl stack). */ ProcErrorProc *errProc; /* The error handler for the body. */ Tcl_Obj *nameObj; /* The "name" of the command. Only used for a * few moments, so not reference. */ } PMFrameData; /* * Structure used to pass information about variable resolution to the * on-the-ground resolvers used when working with resolved compiled variables. */ typedef struct OOResVarInfo { Tcl_ResolvedVarInfo info; /* "Type" information so that the compiled * variable can be linked to the namespace * variable at the right time. */ Tcl_Obj *variableObj; /* The name of the variable. */ Tcl_Var cachedObjectVar; /* TODO: When to flush this cache? Can class * variables be cached? */ } OOResVarInfo; |
︙ | ︙ | |||
142 143 144 145 146 147 148 | { Object *oPtr = (Object *) object; Method *mPtr; Tcl_HashEntry *hPtr; int isNew; if (nameObj == NULL) { | | | | | | 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 | { Object *oPtr = (Object *) object; Method *mPtr; Tcl_HashEntry *hPtr; int isNew; if (nameObj == NULL) { mPtr = (Method *) Tcl_Alloc(sizeof(Method)); mPtr->namePtr = NULL; mPtr->refCount = 1; goto populate; } if (!oPtr->methodsPtr) { oPtr->methodsPtr = (Tcl_HashTable *) Tcl_Alloc(sizeof(Tcl_HashTable)); Tcl_InitObjHashTable(oPtr->methodsPtr); oPtr->flags &= ~USE_CLASS_CACHE; } hPtr = Tcl_CreateHashEntry(oPtr->methodsPtr, nameObj, &isNew); if (isNew) { mPtr = (Method *) Tcl_Alloc(sizeof(Method)); mPtr->namePtr = nameObj; mPtr->refCount = 1; Tcl_IncrRefCount(nameObj); Tcl_SetHashValue(hPtr, mPtr); } else { mPtr = (Method *) Tcl_GetHashValue(hPtr); if (mPtr->typePtr != NULL && mPtr->typePtr->deleteProc != NULL) { mPtr->typePtr->deleteProc(mPtr->clientData); } } populate: mPtr->typePtr = typePtr; |
︙ | ︙ | |||
199 200 201 202 203 204 205 | /* The type of method this is, which defines * how to invoke, delete and clone the * method. */ void *clientData) /* Some data associated with the particular * method to be created. */ { if (typePtr->version > TCL_OO_METHOD_VERSION_1) { | | > | | | > | < | | | | | 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 | /* The type of method this is, which defines * how to invoke, delete and clone the * method. */ void *clientData) /* Some data associated with the particular * method to be created. */ { if (typePtr->version > TCL_OO_METHOD_VERSION_1) { Tcl_Panic("%s: Wrong version in typePtr->version, should be %s", "Tcl_NewInstanceMethod", "TCL_OO_METHOD_VERSION_1"); } return TclNewInstanceMethod(NULL, object, nameObj, flags, typePtr, clientData); } Tcl_Method Tcl_NewInstanceMethod2( TCL_UNUSED(Tcl_Interp *), Tcl_Object object, /* The object that has the method attached to * it. */ Tcl_Obj *nameObj, /* The name of the method. May be NULL; if so, * up to caller to manage storage (e.g., when * it is a constructor or destructor). */ int flags, /* Whether this is a public method. */ const Tcl_MethodType2 *typePtr, /* The type of method this is, which defines * how to invoke, delete and clone the * method. */ void *clientData) /* Some data associated with the particular * method to be created. */ { if (typePtr->version < TCL_OO_METHOD_VERSION_2) { Tcl_Panic("%s: Wrong version in typePtr->version, should be %s", "Tcl_NewInstanceMethod2", "TCL_OO_METHOD_VERSION_2"); } return TclNewInstanceMethod(NULL, object, nameObj, flags, (const Tcl_MethodType *) typePtr, clientData); } /* * ---------------------------------------------------------------------- * * Tcl_NewMethod -- * * Attach a method to a class. * * ---------------------------------------------------------------------- */ Tcl_Method TclNewMethod( Tcl_Class cls, /* The class to attach the method to. */ Tcl_Obj *nameObj, /* The name of the object. May be NULL (e.g., * for constructors or destructors); if so, up * to caller to manage storage. */ int flags, /* Whether this is a public method. */ const Tcl_MethodType *typePtr, /* The type of method this is, which defines * how to invoke, delete and clone the * method. */ void *clientData) /* Some data associated with the particular * method to be created. */ { Class *clsPtr = (Class *) cls; Method *mPtr; Tcl_HashEntry *hPtr; int isNew; if (nameObj == NULL) { mPtr = (Method *) Tcl_Alloc(sizeof(Method)); mPtr->namePtr = NULL; mPtr->refCount = 1; goto populate; } hPtr = Tcl_CreateHashEntry(&clsPtr->classMethods, nameObj, &isNew); if (isNew) { mPtr = (Method *) Tcl_Alloc(sizeof(Method)); mPtr->refCount = 1; mPtr->namePtr = nameObj; Tcl_IncrRefCount(nameObj); Tcl_SetHashValue(hPtr, mPtr); } else { mPtr = (Method *) Tcl_GetHashValue(hPtr); if (mPtr->typePtr != NULL && mPtr->typePtr->deleteProc != NULL) { mPtr->typePtr->deleteProc(mPtr->clientData); } } populate: clsPtr->thisPtr->fPtr->epoch++; |
︙ | ︙ | |||
311 312 313 314 315 316 317 | /* The type of method this is, which defines * how to invoke, delete and clone the * method. */ void *clientData) /* Some data associated with the particular * method to be created. */ { if (typePtr->version > TCL_OO_METHOD_VERSION_1) { | | > | | > > | | 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 | /* The type of method this is, which defines * how to invoke, delete and clone the * method. */ void *clientData) /* Some data associated with the particular * method to be created. */ { if (typePtr->version > TCL_OO_METHOD_VERSION_1) { Tcl_Panic("%s: Wrong version in typePtr->version, should be %s", "Tcl_NewMethod", "TCL_OO_METHOD_VERSION_1"); } return TclNewMethod(cls, nameObj, flags, typePtr, clientData); } Tcl_Method Tcl_NewMethod2( TCL_UNUSED(Tcl_Interp *), Tcl_Class cls, /* The class to attach the method to. */ Tcl_Obj *nameObj, /* The name of the object. May be NULL (e.g., * for constructors or destructors); if so, up * to caller to manage storage. */ int flags, /* Whether this is a public method. */ const Tcl_MethodType2 *typePtr, /* The type of method this is, which defines * how to invoke, delete and clone the * method. */ void *clientData) /* Some data associated with the particular * method to be created. */ { if (typePtr->version < TCL_OO_METHOD_VERSION_2) { Tcl_Panic("%s: Wrong version in typePtr->version, should be %s", "Tcl_NewMethod2", "TCL_OO_METHOD_VERSION_2"); } return TclNewMethod(cls, nameObj, flags, (const Tcl_MethodType *) typePtr, clientData); } /* * ---------------------------------------------------------------------- * * TclOODelMethodRef -- * |
︙ | ︙ | |||
376 377 378 379 380 381 382 | * basic system initialization. Not suitable for general use. * * ---------------------------------------------------------------------- */ void TclOONewBasicMethod( | < < | | | 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 | * basic system initialization. Not suitable for general use. * * ---------------------------------------------------------------------- */ void TclOONewBasicMethod( Class *clsPtr, /* Class to attach the method to. */ const DeclaredClassMethod *dcm) /* Name of the method, whether it is public, * and the function to implement it. */ { Tcl_Obj *namePtr = Tcl_NewStringObj(dcm->name, -1); TclNewMethod((Tcl_Class) clsPtr, namePtr, (dcm->isPublic ? PUBLIC_METHOD : 0), &dcm->definition, NULL); Tcl_BounceRefCount(namePtr); } /* * ---------------------------------------------------------------------- * * TclOONewProcInstanceMethod -- * |
︙ | ︙ | |||
498 499 500 501 502 503 504 | return (Method *) method; } /* * ---------------------------------------------------------------------- * | | | | | | | < | < < < < < < < < < < < < < < < < < | | | < < < < < < < | 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 | return (Method *) method; } /* * ---------------------------------------------------------------------- * * InitCmdFrame -- * * Set up a CmdFrame to record the source location for a procedure * method. Assumes that the body is the last argument to the command * creating the method, a good assumption because putting the body * elsewhere is ugly. * * ---------------------------------------------------------------------- */ static inline void InitCmdFrame( Interp *iPtr, /* Where source locations are recorded. */ Proc *procPtr) /* Guts of the method being made. */ { if (iPtr->cmdFramePtr) { CmdFrame context = *iPtr->cmdFramePtr; if (context.type == TCL_LOCATION_BC) { /* * Retrieve source information from the bytecode, if possible. If * the information is retrieved successfully, context.type will be |
︙ | ︙ | |||
561 562 563 564 565 566 567 | Tcl_IncrRefCount(context.data.eval.path); } if (context.type == TCL_LOCATION_SOURCE) { /* * We can account for source location within a proc only if the | | > > > | | | | | | 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 | Tcl_IncrRefCount(context.data.eval.path); } if (context.type == TCL_LOCATION_SOURCE) { /* * We can account for source location within a proc only if the * proc body was not created by substitution. This is where we * assume that the body is the last argument; the index of the body * is NOT a fixed count of arguments in because of the alternate * form of [oo::define]/[oo::objdefine]. * (FIXME: check that this is sane and correct!) */ if (context.line && context.nline > 1 && (context.line[context.nline - 1] >= 0)) { int isNew; CmdFrame *cfPtr = (CmdFrame *) Tcl_Alloc(sizeof(CmdFrame)); Tcl_HashEntry *hPtr; cfPtr->level = -1; cfPtr->type = context.type; cfPtr->line = (Tcl_Size *) Tcl_Alloc(sizeof(Tcl_Size)); cfPtr->line[0] = context.line[context.nline - 1]; cfPtr->nline = 1; cfPtr->framePtr = NULL; cfPtr->nextPtr = NULL; cfPtr->data.eval.path = context.data.eval.path; Tcl_IncrRefCount(cfPtr->data.eval.path); |
︙ | ︙ | |||
598 599 600 601 602 603 604 | * 'context' is going out of scope; account for the reference that * it's holding to the path name. */ Tcl_DecrRefCount(context.data.eval.path); context.data.eval.path = NULL; } | > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 | * 'context' is going out of scope; account for the reference that * it's holding to the path name. */ Tcl_DecrRefCount(context.data.eval.path); context.data.eval.path = NULL; } }} /* * ---------------------------------------------------------------------- * * TclOOMakeProcInstanceMethod -- * * The guts of the code to make a procedure-like method for an object. * Split apart so that it is easier for other extensions to reuse (in * particular, it frees them from having to pry so deeply into Tcl's * guts). * * ---------------------------------------------------------------------- */ Tcl_Method TclOOMakeProcInstanceMethod( Tcl_Interp *interp, /* The interpreter containing the object. */ Object *oPtr, /* The object to modify. */ int flags, /* Whether this is a public method. */ Tcl_Obj *nameObj, /* The name of the method, which _must not_ be * NULL. */ Tcl_Obj *argsObj, /* The formal argument list for the method, * which _must not_ be NULL. */ Tcl_Obj *bodyObj, /* The body of the method, which _must not_ be * NULL. */ const Tcl_MethodType *typePtr, /* The type of the method to create. */ void *clientData, /* The per-method type-specific data. */ Proc **procPtrPtr) /* A pointer to the variable in which to write * the procedure record reference. Presumably * inside the structure indicated by the * pointer in clientData. */ { Interp *iPtr = (Interp *) interp; Proc *procPtr; if (TclCreateProc(interp, NULL, TclGetString(nameObj), argsObj, bodyObj, procPtrPtr) != TCL_OK) { return NULL; } procPtr = *procPtrPtr; procPtr->cmdPtr = NULL; InitCmdFrame(iPtr, procPtr); return TclNewInstanceMethod(interp, (Tcl_Object) oPtr, nameObj, flags, typePtr, clientData); } /* * ---------------------------------------------------------------------- |
︙ | ︙ | |||
634 635 636 637 638 639 640 | * _must not_ be NULL. */ Tcl_Obj *argsObj, /* The formal argument list for the method, * which _must not_ be NULL. */ Tcl_Obj *bodyObj, /* The body of the method, which _must not_ be * NULL. */ const Tcl_MethodType *typePtr, /* The type of the method to create. */ | | < < | < < < < < < < < < < < < < | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | < | | | | 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 | * _must not_ be NULL. */ Tcl_Obj *argsObj, /* The formal argument list for the method, * which _must not_ be NULL. */ Tcl_Obj *bodyObj, /* The body of the method, which _must not_ be * NULL. */ const Tcl_MethodType *typePtr, /* The type of the method to create. */ void *clientData, /* The per-method type-specific data. */ Proc **procPtrPtr) /* A pointer to the variable in which to write * the procedure record reference. Presumably * inside the structure indicated by the * pointer in clientData. */ { Interp *iPtr = (Interp *) interp; Proc *procPtr; if (TclCreateProc(interp, NULL, namePtr, argsObj, bodyObj, procPtrPtr) != TCL_OK) { return NULL; } procPtr = *procPtrPtr; procPtr->cmdPtr = NULL; InitCmdFrame(iPtr, procPtr); return TclNewMethod( (Tcl_Class) clsPtr, nameObj, flags, typePtr, clientData); } /* * ---------------------------------------------------------------------- * * InvokeProcedureMethod, PushMethodCallFrame -- * * How to invoke a procedure-like method. * * ---------------------------------------------------------------------- */ static int InvokeProcedureMethod( void *clientData, /* Pointer to some per-method context. */ Tcl_Interp *interp, Tcl_ObjectContext context, /* The method calling context. */ int objc, /* Number of arguments. */ Tcl_Obj *const *objv) /* Arguments as actually seen. */ { ProcedureMethod *pmPtr = (ProcedureMethod *) clientData; int result; PMFrameData *fdPtr; /* Important data that has to have a lifetime * matched by this function (or rather, by the * call frame's lifetime). */ /* * If the object namespace (or interpreter) were deleted, we just skip to * the next thing in the chain. */ if (TclOOObjectDestroyed(((CallContext *) context)->oPtr) || Tcl_InterpDeleted(interp)) { return TclNRObjectContextInvokeNext(interp, context, objc, objv, Tcl_ObjectContextSkippedArgs(context)); } /* * Finishes filling out the extra frame info so that [info frame] works if |
︙ | ︙ | |||
787 788 789 790 791 792 793 | } } /* * Allocate the special frame data. */ | | | 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 | } } /* * Allocate the special frame data. */ fdPtr = (PMFrameData *) TclStackAlloc(interp, sizeof(PMFrameData)); /* * Create a call frame for this method. */ result = PushMethodCallFrame(interp, (CallContext *) context, pmPtr, objc, objv, fdPtr); |
︙ | ︙ | |||
837 838 839 840 841 842 843 | static int FinalizePMCall( void *data[], Tcl_Interp *interp, int result) { | | | | | 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 | static int FinalizePMCall( void *data[], Tcl_Interp *interp, int result) { ProcedureMethod *pmPtr = (ProcedureMethod *) data[0]; Tcl_ObjectContext context = (Tcl_ObjectContext) data[1]; PMFrameData *fdPtr = (PMFrameData *) data[2]; /* * Give the post-call callback a chance to do some cleanup. Note that at * this point the call frame itself is invalid; it's already been popped. */ if (pmPtr->postCallProc) { |
︙ | ︙ | |||
985 986 987 988 989 990 991 | } static int ProcedureMethodVarResolver( Tcl_Interp *interp, const char *varName, Tcl_Namespace *contextNs, | | | 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 | } static int ProcedureMethodVarResolver( Tcl_Interp *interp, const char *varName, Tcl_Namespace *contextNs, TCL_UNUSED(int) /*flags*/, // Ignoring variable access flags (???) Tcl_Var *varPtr) { int result; Tcl_ResolvedVarInfo *rPtr = NULL; result = ProcedureMethodCompiledVarResolver(interp, varName, strlen(varName), contextNs, &rPtr); |
︙ | ︙ | |||
1033 1034 1035 1036 1037 1038 1039 | * method call; if not (i.e. we're evaluating in the object's namespace or * in a procedure of that namespace) then we do nothing. */ if (framePtr == NULL || !(framePtr->isProcCallFrame & FRAME_IS_METHOD)) { return NULL; } | | | 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 | * method call; if not (i.e. we're evaluating in the object's namespace or * in a procedure of that namespace) then we do nothing. */ if (framePtr == NULL || !(framePtr->isProcCallFrame & FRAME_IS_METHOD)) { return NULL; } contextPtr = (CallContext *) framePtr->clientData; /* * If we've done the work before (in a comparable context) then reuse that * rather than performing resolution ourselves. */ if (infoPtr->cachedObjectVar) { |
︙ | ︙ | |||
1153 1154 1155 1156 1157 1158 1159 | if (strstr(TclGetString(variableObj), "::") != NULL || Tcl_StringMatch(TclGetString(variableObj), "*(*)")) { Tcl_DecrRefCount(variableObj); return TCL_CONTINUE; } | | | 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 | if (strstr(TclGetString(variableObj), "::") != NULL || Tcl_StringMatch(TclGetString(variableObj), "*(*)")) { Tcl_DecrRefCount(variableObj); return TCL_CONTINUE; } infoPtr = (OOResVarInfo *) Tcl_Alloc(sizeof(OOResVarInfo)); infoPtr->info.fetchProc = ProcedureMethodCompiledVarConnect; infoPtr->info.deleteProc = ProcedureMethodCompiledVarDelete; infoPtr->cachedObjectVar = NULL; infoPtr->variableObj = variableObj; Tcl_IncrRefCount(variableObj); *rPtrPtr = &infoPtr->info; return TCL_OK; |
︙ | ︙ | |||
1230 1231 1232 1233 1234 1235 1236 | * and ELLIPSIFY is a macro to do the conversion (with the help of a * %.*s%s format field). Note that ELLIPSIFY is only safe for use in * suitable formatting contexts. * * ---------------------------------------------------------------------- */ | | | | > | 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 | * and ELLIPSIFY is a macro to do the conversion (with the help of a * %.*s%s format field). Note that ELLIPSIFY is only safe for use in * suitable formatting contexts. * * ---------------------------------------------------------------------- */ // TODO: Check whether Tcl_AppendLimitedToObj() can work here. #define LIMIT 60 #define ELLIPSIFY(str,len) \ ((len) > LIMIT ? LIMIT : (int)(len)), (str), ((len) > LIMIT ? "..." : "") static void MethodErrorHandler( Tcl_Interp *interp, TCL_UNUSED(Tcl_Obj *) /*methodNameObj*/) // We pull the method name out of context instead of from argument { Tcl_Size nameLen, objectNameLen; CallContext *contextPtr = (CallContext *) ((Interp *) interp)->varFramePtr->clientData; Method *mPtr = contextPtr->callPtr->chain[contextPtr->index].mPtr; const char *objectName, *kindName, *methodName = Tcl_GetStringFromObj(mPtr->namePtr, &nameLen); Object *declarerPtr; if (mPtr->declaringObjectPtr != NULL) { declarerPtr = mPtr->declaringObjectPtr; |
︙ | ︙ | |||
1272 1273 1274 1275 1276 1277 1278 | ELLIPSIFY(methodName, nameLen), Tcl_GetErrorLine(interp))); } static void ConstructorErrorHandler( Tcl_Interp *interp, TCL_UNUSED(Tcl_Obj *) /*methodNameObj*/) | | | > | 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 | ELLIPSIFY(methodName, nameLen), Tcl_GetErrorLine(interp))); } static void ConstructorErrorHandler( Tcl_Interp *interp, TCL_UNUSED(Tcl_Obj *) /*methodNameObj*/) // Ignore. We know it is the constructor. { CallContext *contextPtr = (CallContext *) ((Interp *) interp)->varFramePtr->clientData; Method *mPtr = contextPtr->callPtr->chain[contextPtr->index].mPtr; Object *declarerPtr; const char *objectName, *kindName; Tcl_Size objectNameLen; if (mPtr->declaringObjectPtr != NULL) { declarerPtr = mPtr->declaringObjectPtr; |
︙ | ︙ | |||
1302 1303 1304 1305 1306 1307 1308 | ELLIPSIFY(objectName, objectNameLen), Tcl_GetErrorLine(interp))); } static void DestructorErrorHandler( Tcl_Interp *interp, TCL_UNUSED(Tcl_Obj *) /*methodNameObj*/) | | | > | 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 | ELLIPSIFY(objectName, objectNameLen), Tcl_GetErrorLine(interp))); } static void DestructorErrorHandler( Tcl_Interp *interp, TCL_UNUSED(Tcl_Obj *) /*methodNameObj*/) // Ignore. We know it is the destructor. { CallContext *contextPtr = (CallContext *) ((Interp *) interp)->varFramePtr->clientData; Method *mPtr = contextPtr->callPtr->chain[contextPtr->index].mPtr; Object *declarerPtr; const char *objectName, *kindName; Tcl_Size objectNameLen; if (mPtr->declaringObjectPtr != NULL) { declarerPtr = mPtr->declaringObjectPtr; |
︙ | ︙ | |||
1353 1354 1355 1356 1357 1358 1359 | Tcl_Free(pmPtr); } static void DeleteProcedureMethod( void *clientData) { | | | | 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 | Tcl_Free(pmPtr); } static void DeleteProcedureMethod( void *clientData) { ProcedureMethod *pmPtr = (ProcedureMethod *) clientData; if (pmPtr->refCount-- <= 1) { DeleteProcedureMethodRecord(pmPtr); } } static int CloneProcedureMethod( Tcl_Interp *interp, void *clientData, void **newClientData) { ProcedureMethod *pmPtr = (ProcedureMethod *) clientData; ProcedureMethod *pm2Ptr; Tcl_Obj *bodyObj, *argsObj; CompiledLocal *localPtr; /* * Copy the argument list. */ |
︙ | ︙ | |||
1405 1406 1407 1408 1409 1410 1411 | Tcl_StoreInternalRep(pmPtr->procPtr->bodyPtr, &tclByteCodeType, NULL); /* * Create the actual copy of the method record, manufacturing a new proc * record. */ | | | 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 | Tcl_StoreInternalRep(pmPtr->procPtr->bodyPtr, &tclByteCodeType, NULL); /* * Create the actual copy of the method record, manufacturing a new proc * record. */ pm2Ptr = (ProcedureMethod *) Tcl_Alloc(sizeof(ProcedureMethod)); memcpy(pm2Ptr, pmPtr, sizeof(ProcedureMethod)); pm2Ptr->refCount = 1; pm2Ptr->cmd.clientData = &pm2Ptr->efi; pm2Ptr->efi.length = 0; /* Trigger a reinit of this. */ Tcl_IncrRefCount(argsObj); Tcl_IncrRefCount(bodyObj); if (TclCreateProc(interp, NULL, "", argsObj, bodyObj, |
︙ | ︙ | |||
1461 1462 1463 1464 1465 1466 1467 | if (prefixLen < 1) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "method forward prefix must be non-empty", -1)); Tcl_SetErrorCode(interp, "TCL", "OO", "BAD_FORWARD", (char *)NULL); return NULL; } | | | 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 | if (prefixLen < 1) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "method forward prefix must be non-empty", -1)); Tcl_SetErrorCode(interp, "TCL", "OO", "BAD_FORWARD", (char *)NULL); return NULL; } fmPtr = (ForwardMethod *) Tcl_Alloc(sizeof(ForwardMethod)); fmPtr->prefixObj = prefixObj; Tcl_IncrRefCount(prefixObj); return (Method *) TclNewInstanceMethod(interp, (Tcl_Object) oPtr, nameObj, flags, &fwdMethodType, fmPtr); } /* |
︙ | ︙ | |||
1500 1501 1502 1503 1504 1505 1506 | if (prefixLen < 1) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "method forward prefix must be non-empty", -1)); Tcl_SetErrorCode(interp, "TCL", "OO", "BAD_FORWARD", (char *)NULL); return NULL; } | | | | | | | | | | | | 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 | if (prefixLen < 1) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "method forward prefix must be non-empty", -1)); Tcl_SetErrorCode(interp, "TCL", "OO", "BAD_FORWARD", (char *)NULL); return NULL; } fmPtr = (ForwardMethod *) Tcl_Alloc(sizeof(ForwardMethod)); fmPtr->prefixObj = prefixObj; Tcl_IncrRefCount(prefixObj); return (Method *) TclNewMethod((Tcl_Class) clsPtr, nameObj, flags, &fwdMethodType, fmPtr); } /* * ---------------------------------------------------------------------- * * InvokeForwardMethod -- * * How to invoke a forwarded method. Works by doing some ensemble-like * command rearranging and then invokes some other Tcl command. * * ---------------------------------------------------------------------- */ static int InvokeForwardMethod( void *clientData, /* Pointer to some per-method context. */ Tcl_Interp *interp, Tcl_ObjectContext context, /* The method calling context. */ int objc, /* Number of arguments. */ Tcl_Obj *const *objv) /* Arguments as actually seen. */ { CallContext *contextPtr = (CallContext *) context; ForwardMethod *fmPtr = (ForwardMethod *) clientData; Tcl_Obj **argObjs, **prefixObjs; Tcl_Size numPrefixes, skip = contextPtr->skip; int len; /* * Build the real list of arguments to use. Note that we know that the * prefixObj field of the ForwardMethod structure holds a reference to a * non-empty list, so there's a whole class of failures ("not a list") we * can ignore here. */ TclListObjGetElements(NULL, fmPtr->prefixObj, &numPrefixes, &prefixObjs); argObjs = InitEnsembleRewrite(interp, objc, objv, skip, numPrefixes, prefixObjs, &len); Tcl_NRAddCallback(interp, FinalizeForwardCall, argObjs, NULL, NULL, NULL); /* * NOTE: The combination of direct set of iPtr->lookupNsPtr and the use * of the TCL_EVAL_NOERR flag results in an evaluation configuration * very much like TCL_EVAL_INVOKE. */ ((Interp *) interp)->lookupNsPtr = (Namespace *) contextPtr->oPtr->namespacePtr; return TclNREvalObjv(interp, len, argObjs, TCL_EVAL_NOERR, NULL); } static int FinalizeForwardCall( void *data[], Tcl_Interp *interp, int result) { Tcl_Obj **argObjs = (Tcl_Obj **) data[0]; TclStackFree(interp, argObjs); return result; } /* * ---------------------------------------------------------------------- * * DeleteForwardMethod, CloneForwardMethod -- * * How to delete and clone forwarded methods. * * ---------------------------------------------------------------------- */ static void DeleteForwardMethod( void *clientData) { ForwardMethod *fmPtr = (ForwardMethod *) clientData; Tcl_DecrRefCount(fmPtr->prefixObj); Tcl_Free(fmPtr); } static int CloneForwardMethod( TCL_UNUSED(Tcl_Interp *), void *clientData, void **newClientData) { ForwardMethod *fmPtr = (ForwardMethod *) clientData; ForwardMethod *fm2Ptr = (ForwardMethod *) Tcl_Alloc(sizeof(ForwardMethod)); fm2Ptr->prefixObj = fmPtr->prefixObj; Tcl_IncrRefCount(fm2Ptr->prefixObj); *newClientData = fm2Ptr; return TCL_OK; } |
︙ | ︙ | |||
1616 1617 1618 1619 1620 1621 1622 | */ Proc * TclOOGetProcFromMethod( Method *mPtr) { if (mPtr->typePtr == &procMethodType) { | | | | | 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 | */ Proc * TclOOGetProcFromMethod( Method *mPtr) { if (mPtr->typePtr == &procMethodType) { ProcedureMethod *pmPtr = (ProcedureMethod *) mPtr->clientData; return pmPtr->procPtr; } return NULL; } Tcl_Obj * TclOOGetMethodBody( Method *mPtr) { if (mPtr->typePtr == &procMethodType) { ProcedureMethod *pmPtr = (ProcedureMethod *) mPtr->clientData; (void) TclGetString(pmPtr->procPtr->bodyPtr); return pmPtr->procPtr->bodyPtr; } return NULL; } Tcl_Obj * TclOOGetFwdFromMethod( Method *mPtr) { if (mPtr->typePtr == &fwdMethodType) { ForwardMethod *fwPtr = (ForwardMethod *) mPtr->clientData; return fwPtr->prefixObj; } return NULL; } /* |
︙ | ︙ | |||
1683 1684 1685 1686 1687 1688 1689 | int toRewrite, /* Number of real arguments to replace. */ int rewriteLength, /* Number of arguments to insert instead. */ Tcl_Obj *const *rewriteObjs,/* Arguments to insert instead. */ int *lengthPtr) /* Where to write the resulting length of the * array of rewritten arguments. */ { size_t len = rewriteLength + objc - toRewrite; | | > | 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 | int toRewrite, /* Number of real arguments to replace. */ int rewriteLength, /* Number of arguments to insert instead. */ Tcl_Obj *const *rewriteObjs,/* Arguments to insert instead. */ int *lengthPtr) /* Where to write the resulting length of the * array of rewritten arguments. */ { size_t len = rewriteLength + objc - toRewrite; Tcl_Obj **argObjs = (Tcl_Obj **) TclStackAlloc(interp, sizeof(Tcl_Obj *) * len); memcpy(argObjs, rewriteObjs, rewriteLength * sizeof(Tcl_Obj *)); memcpy(argObjs + rewriteLength, objv + toRewrite, sizeof(Tcl_Obj *) * (objc - toRewrite)); /* * Now plumb this into the core ensemble rewrite logging system so that |
︙ | ︙ | |||
1760 1761 1762 1763 1764 1765 1766 | Tcl_Method method, const Tcl_MethodType *typePtr, void **clientDataPtr) { Method *mPtr = (Method *) method; if (typePtr->version > TCL_OO_METHOD_VERSION_1) { | | > | > | | | | 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 | Tcl_Method method, const Tcl_MethodType *typePtr, void **clientDataPtr) { Method *mPtr = (Method *) method; if (typePtr->version > TCL_OO_METHOD_VERSION_1) { Tcl_Panic("%s: Wrong version in typePtr->version, should be %s", "Tcl_MethodIsType", "TCL_OO_METHOD_VERSION_1"); } if (mPtr->typePtr == typePtr) { if (clientDataPtr != NULL) { *clientDataPtr = mPtr->clientData; } return 1; } return 0; } int Tcl_MethodIsType2( Tcl_Method method, const Tcl_MethodType2 *typePtr, void **clientDataPtr) { Method *mPtr = (Method *) method; if (typePtr->version < TCL_OO_METHOD_VERSION_2) { Tcl_Panic("%s: Wrong version in typePtr->version, should be %s", "Tcl_MethodIsType2", "TCL_OO_METHOD_VERSION_2"); } if (mPtr->typePtr == (const Tcl_MethodType *) typePtr) { if (clientDataPtr != NULL) { *clientDataPtr = mPtr->clientData; } return 1; } return 0; } int Tcl_MethodIsPublic( Tcl_Method method) { return (((Method *) method)->flags & PUBLIC_METHOD) ? 1 : 0; } int Tcl_MethodIsPrivate( Tcl_Method method) { return (((Method *) method)->flags & TRUE_PRIVATE_METHOD) ? 1 : 0; } /* * Extended method construction for itcl-ng. */ Tcl_Method |
︙ | ︙ |
Added generic/tclOOProp.c.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 | /* * tclOOProp.c -- * * This file contains implementations of the configurable property * mecnanisms. * * Copyright © 2023-2024 Donal K. Fellows * * See the file "license.terms" for information on usage and redistribution of * this file, and for a DISCLAIMER OF ALL WARRANTIES. */ #include "tclOOInt.h" /* Short-term cache for GetPropertyName(). */ typedef struct GPNCache { Tcl_Obj *listPtr; /* Holds references to names. */ char *names[TCLFLEXARRAY]; /* NULL-terminated table of names. */ } GPNCache; enum GPNFlags { GPN_WRITABLE = 1, /* Are we looking for a writable property? */ GPN_FALLING_BACK = 2 /* Are we doing a recursive call to determine * if the property is of the other type? */ }; /* * Shared bits for [property] declarations. */ enum PropOpt { PROP_ALL, PROP_READABLE, PROP_WRITABLE }; static const char *const propOptNames[] = { "-all", "-readable", "-writable", NULL }; /* * Forward declarations. */ static int Configurable_Getter(void *clientData, Tcl_Interp *interp, Tcl_ObjectContext context, int objc, Tcl_Obj *const *objv); static int Configurable_Setter(void *clientData, Tcl_Interp *interp, Tcl_ObjectContext context, int objc, Tcl_Obj *const *objv); static void DetailsDeleter(void *clientData); static int DetailsCloner(Tcl_Interp *, void *oldClientData, void **newClientData); static void ImplementObjectProperty(Tcl_Object targetObject, Tcl_Obj *propNamePtr, int installGetter, int installSetter); static void ImplementClassProperty(Tcl_Class targetObject, Tcl_Obj *propNamePtr, int installGetter, int installSetter); /* * Method descriptors */ static const Tcl_MethodType GetterType = { TCL_OO_METHOD_VERSION_1, "PropertyGetter", Configurable_Getter, DetailsDeleter, DetailsCloner }; static const Tcl_MethodType SetterType = { TCL_OO_METHOD_VERSION_1, "PropertySetter", Configurable_Setter, DetailsDeleter, DetailsCloner }; /* * ---------------------------------------------------------------------- * * TclOO_Configurable_Configure -- * * Implementation of the oo::configurable->configure method. * * ---------------------------------------------------------------------- */ /* * Ugly thunks to read and write a property by calling the right method in * the right way. Note that we MUST be correct in holding references to Tcl_Obj * values, as this is potentially a call into user code. */ static inline int ReadProperty( Tcl_Interp *interp, Object *oPtr, const char *propName) { Tcl_Obj *args[] = { oPtr->fPtr->myName, Tcl_ObjPrintf("<ReadProp%s>", propName) }; int code; Tcl_IncrRefCount(args[0]); Tcl_IncrRefCount(args[1]); code = TclOOPrivateObjectCmd(oPtr, interp, 2, args); Tcl_DecrRefCount(args[0]); Tcl_DecrRefCount(args[1]); switch (code) { case TCL_BREAK: Tcl_SetObjResult(interp, Tcl_ObjPrintf( "property getter for %s did a break", propName)); return TCL_ERROR; case TCL_CONTINUE: Tcl_SetObjResult(interp, Tcl_ObjPrintf( "property getter for %s did a continue", propName)); return TCL_ERROR; default: return code; } } static inline int WriteProperty( Tcl_Interp *interp, Object *oPtr, const char *propName, Tcl_Obj *valueObj) { Tcl_Obj *args[] = { oPtr->fPtr->myName, Tcl_ObjPrintf("<WriteProp%s>", propName), valueObj }; int code; Tcl_IncrRefCount(args[0]); Tcl_IncrRefCount(args[1]); Tcl_IncrRefCount(args[2]); code = TclOOPrivateObjectCmd(oPtr, interp, 3, args); Tcl_DecrRefCount(args[0]); Tcl_DecrRefCount(args[1]); Tcl_DecrRefCount(args[2]); switch (code) { case TCL_BREAK: Tcl_SetObjResult(interp, Tcl_ObjPrintf( "property setter for %s did a break", propName)); return TCL_ERROR; case TCL_CONTINUE: Tcl_SetObjResult(interp, Tcl_ObjPrintf( "property setter for %s did a continue", propName)); return TCL_ERROR; default: return code; } } /* Look up a property full name. */ static Tcl_Obj * GetPropertyName( Tcl_Interp *interp, /* Context and error reporting. */ Object *oPtr, /* Object to get property name from. */ int flags, /* Are we looking for a writable property? * Can we do a fallback message? * See GPNFlags for possible values */ Tcl_Obj *namePtr, /* The name supplied by the user. */ GPNCache **cachePtr) /* Where to cache the table, if the caller * wants that. The contents are to be freed * with Tcl_Free if the cache is used. */ { Tcl_Size objc, index, i; Tcl_Obj *listPtr = TclOOGetAllObjectProperties( oPtr, flags & GPN_WRITABLE); Tcl_Obj **objv; GPNCache *tablePtr; (void) Tcl_ListObjGetElements(NULL, listPtr, &objc, &objv); if (cachePtr && *cachePtr) { tablePtr = *cachePtr; } else { tablePtr = (GPNCache *) TclStackAlloc(interp, offsetof(GPNCache, names) + sizeof(char *) * (objc + 1)); for (i = 0; i < objc; i++) { tablePtr->names[i] = TclGetString(objv[i]); } tablePtr->names[objc] = NULL; if (cachePtr) { /* * Have a cache, but nothing in it so far. * * We cache the list here so it doesn't vanish from under our * feet if a property implementation does something crazy like * changing the set of properties. The type of copy this does * means that the copy holds the references to the names in the * table. */ tablePtr->listPtr = TclListObjCopy(NULL, listPtr); Tcl_IncrRefCount(tablePtr->listPtr); *cachePtr = tablePtr; } else { tablePtr->listPtr = NULL; } } int result = Tcl_GetIndexFromObjStruct(interp, namePtr, tablePtr->names, sizeof(char *), "property", TCL_INDEX_TEMP_TABLE, &index); if (result == TCL_ERROR && !(flags & GPN_FALLING_BACK)) { /* * If property can be accessed the other way, use a special message. * We use a recursive call to look this up. */ Tcl_InterpState foo = Tcl_SaveInterpState(interp, result); Tcl_Obj *otherName = GetPropertyName(interp, oPtr, flags ^ (GPN_WRITABLE | GPN_FALLING_BACK), namePtr, NULL); result = Tcl_RestoreInterpState(interp, foo); if (otherName != NULL) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "property \"%s\" is %s only", TclGetString(otherName), (flags & GPN_WRITABLE) ? "read" : "write")); } } if (!cachePtr) { TclStackFree(interp, tablePtr); } if (result != TCL_OK) { return NULL; } return objv[index]; } /* Release the cache made by GetPropertyName(). */ static inline void ReleasePropertyNameCache( Tcl_Interp *interp, GPNCache **cachePtr) { if (*cachePtr) { GPNCache *tablePtr = *cachePtr; if (tablePtr->listPtr) { Tcl_DecrRefCount(tablePtr->listPtr); } TclStackFree(interp, tablePtr); *cachePtr = NULL; } } int TclOO_Configurable_Configure( TCL_UNUSED(void *), Tcl_Interp *interp, /* Interpreter used for the result, error * reporting, etc. */ Tcl_ObjectContext context, /* The object/call context. */ int objc, /* Number of arguments. */ Tcl_Obj *const *objv) /* The actual arguments. */ { Object *oPtr = (Object *) Tcl_ObjectContextObject(context); Tcl_Size skip = Tcl_ObjectContextSkippedArgs(context); Tcl_Obj *namePtr; Tcl_Size i, namec; int code = TCL_OK; objc -= skip; if ((objc & 1) && (objc != 1)) { /* * Bad (odd > 1) number of arguments. */ Tcl_WrongNumArgs(interp, skip, objv, "?-option value ...?"); return TCL_ERROR; } objv += skip; if (objc == 0) { /* * Read all properties. */ Tcl_Obj *listPtr = TclOOGetAllObjectProperties(oPtr, 0); Tcl_Obj *resultPtr = Tcl_NewObj(), **namev; Tcl_IncrRefCount(listPtr); ListObjGetElements(listPtr, namec, namev); for (i = 0; i < namec; ) { code = ReadProperty(interp, oPtr, TclGetString(namev[i])); if (code != TCL_OK) { Tcl_DecrRefCount(resultPtr); break; } Tcl_DictObjPut(NULL, resultPtr, namev[i], Tcl_GetObjResult(interp)); if (++i >= namec) { Tcl_SetObjResult(interp, resultPtr); break; } Tcl_SetObjResult(interp, Tcl_NewObj()); } Tcl_DecrRefCount(listPtr); return code; } else if (objc == 1) { /* * Read a single named property. */ namePtr = GetPropertyName(interp, oPtr, 0, objv[0], NULL); if (namePtr == NULL) { return TCL_ERROR; } return ReadProperty(interp, oPtr, TclGetString(namePtr)); } else if (objc == 2) { /* * Special case for writing to one property. Saves fiddling with the * cache in this common case. */ namePtr = GetPropertyName(interp, oPtr, GPN_WRITABLE, objv[0], NULL); if (namePtr == NULL) { return TCL_ERROR; } code = WriteProperty(interp, oPtr, TclGetString(namePtr), objv[1]); if (code == TCL_OK) { Tcl_ResetResult(interp); } return code; } else { /* * Write properties. Slightly tricky because we want to cache the * table of property names. */ GPNCache *cache = NULL; code = TCL_OK; for (i = 0; i < objc; i += 2) { namePtr = GetPropertyName(interp, oPtr, GPN_WRITABLE, objv[i], &cache); if (namePtr == NULL) { code = TCL_ERROR; break; } code = WriteProperty(interp, oPtr, TclGetString(namePtr), objv[i + 1]); if (code != TCL_OK) { break; } } if (code == TCL_OK) { Tcl_ResetResult(interp); } ReleasePropertyNameCache(interp, &cache); return code; } } /* * ---------------------------------------------------------------------- * * Configurable_Getter, Configurable_Setter -- * * Standard property implementation. The clientData is a simple Tcl_Obj* * that contains the name of the property. * * ---------------------------------------------------------------------- */ static int Configurable_Getter( void *clientData, /* Which property to read. Actually a Tcl_Obj* * reference that is the name of the variable * in the cpntext object. */ Tcl_Interp *interp, /* Interpreter used for the result, error * reporting, etc. */ Tcl_ObjectContext context, /* The object/call context. */ int objc, /* Number of arguments. */ Tcl_Obj *const *objv) /* The actual arguments. */ { Tcl_Obj *propNamePtr = (Tcl_Obj *) clientData; Tcl_Var varPtr, aryVar; Tcl_Obj *valuePtr; if ((int) Tcl_ObjectContextSkippedArgs(context) != objc) { Tcl_WrongNumArgs(interp, Tcl_ObjectContextSkippedArgs(context), objv, NULL); return TCL_ERROR; } varPtr = TclOOLookupObjectVar(interp, Tcl_ObjectContextObject(context), propNamePtr, &aryVar); if (varPtr == NULL) { return TCL_ERROR; } valuePtr = TclPtrGetVar(interp, varPtr, aryVar, propNamePtr, NULL, TCL_NAMESPACE_ONLY | TCL_LEAVE_ERR_MSG); if (valuePtr == NULL) { return TCL_ERROR; } Tcl_SetObjResult(interp, valuePtr); return TCL_OK; } static int Configurable_Setter( void *clientData, /* Which property to write. Actually a Tcl_Obj* * reference that is the name of the variable * in the cpntext object. */ Tcl_Interp *interp, /* Interpreter used for the result, error * reporting, etc. */ Tcl_ObjectContext context, /* The object/call context. */ int objc, /* Number of arguments. */ Tcl_Obj *const *objv) /* The actual arguments. */ { Tcl_Obj *propNamePtr = (Tcl_Obj *) clientData; Tcl_Var varPtr, aryVar; if ((int) Tcl_ObjectContextSkippedArgs(context) + 1 != objc) { Tcl_WrongNumArgs(interp, Tcl_ObjectContextSkippedArgs(context), objv, "value"); return TCL_ERROR; } varPtr = TclOOLookupObjectVar(interp, Tcl_ObjectContextObject(context), propNamePtr, &aryVar); if (varPtr == NULL) { return TCL_ERROR; } if (TclPtrSetVar(interp, varPtr, aryVar, propNamePtr, NULL, objv[objc - 1], TCL_NAMESPACE_ONLY | TCL_LEAVE_ERR_MSG) == NULL) { return TCL_ERROR; } return TCL_OK; } // Simple support functions static void DetailsDeleter( void *clientData) { // Just drop the reference count Tcl_Obj *propNamePtr = (Tcl_Obj *) clientData; Tcl_DecrRefCount(propNamePtr); } static int DetailsCloner( TCL_UNUSED(Tcl_Interp *), void *oldClientData, void **newClientData) { // Just add another reference to this name; easy! Tcl_Obj *propNamePtr = (Tcl_Obj *) oldClientData; Tcl_IncrRefCount(propNamePtr); *newClientData = propNamePtr; return TCL_OK; } /* * ---------------------------------------------------------------------- * * ImplementObjectProperty, ImplementClassProperty -- * * Installs a basic property implementation for a property, either on * an instance or on a class. It's up to the code that calls these * to ensure that the property name is syntactically valid. * * ---------------------------------------------------------------------- */ void ImplementObjectProperty( Tcl_Object targetObject, /* What to install into. */ Tcl_Obj *propNamePtr, /* Property name. */ int installGetter, /* Whether to install a standard getter. */ int installSetter) /* Whether to install a standard setter. */ { const char *propName = TclGetString(propNamePtr); while (propName[0] == '-') { propName++; } if (installGetter) { Tcl_Obj *methodName = Tcl_ObjPrintf("<ReadProp-%s>", propName); Tcl_IncrRefCount(propNamePtr); // Paired with DetailsDeleter TclNewInstanceMethod( NULL, targetObject, methodName, 0, &GetterType, propNamePtr); Tcl_BounceRefCount(methodName); } if (installSetter) { Tcl_Obj *methodName = Tcl_ObjPrintf("<WriteProp-%s>", propName); Tcl_IncrRefCount(propNamePtr); // Paired with DetailsDeleter TclNewInstanceMethod( NULL, targetObject, methodName, 0, &SetterType, propNamePtr); Tcl_BounceRefCount(methodName); } } void ImplementClassProperty( Tcl_Class targetClass, /* What to install into. */ Tcl_Obj *propNamePtr, /* Property name. */ int installGetter, /* Whether to install a standard getter. */ int installSetter) /* Whether to install a standard setter. */ { const char *propName = TclGetString(propNamePtr); while (propName[0] == '-') { propName++; } if (installGetter) { Tcl_Obj *methodName = Tcl_ObjPrintf("<ReadProp-%s>", propName); Tcl_IncrRefCount(propNamePtr); // Paired with DetailsDeleter TclNewMethod(targetClass, methodName, 0, &GetterType, propNamePtr); Tcl_BounceRefCount(methodName); } if (installSetter) { Tcl_Obj *methodName = Tcl_ObjPrintf("<WriteProp-%s>", propName); Tcl_IncrRefCount(propNamePtr); // Paired with DetailsDeleter TclNewMethod(targetClass, methodName, 0, &SetterType, propNamePtr); Tcl_BounceRefCount(methodName); } } /* * ---------------------------------------------------------------------- * * FindClassProps -- * * Discover the properties known to a class and its superclasses. * The property names become the keys in the accumulator hash table * (which is used as a set). * * ---------------------------------------------------------------------- */ static void FindClassProps( Class *clsPtr, /* The object to inspect. Must exist. */ int writable, /* Whether we're after the readable or writable * property set. */ Tcl_HashTable *accumulator) /* Where to gather the names. */ { int i, dummy; Tcl_Obj *propName; Class *mixin, *sup; tailRecurse: if (writable) { FOREACH(propName, clsPtr->properties.writable) { Tcl_CreateHashEntry(accumulator, (void *) propName, &dummy); } } else { FOREACH(propName, clsPtr->properties.readable) { Tcl_CreateHashEntry(accumulator, (void *) propName, &dummy); } } if (clsPtr->thisPtr->flags & ROOT_OBJECT) { /* * We do *not* traverse upwards from the root! */ return; } FOREACH(mixin, clsPtr->mixins) { FindClassProps(mixin, writable, accumulator); } if (clsPtr->superclasses.num == 1) { clsPtr = clsPtr->superclasses.list[0]; goto tailRecurse; } FOREACH(sup, clsPtr->superclasses) { FindClassProps(sup, writable, accumulator); } } /* * ---------------------------------------------------------------------- * * FindObjectProps -- * * Discover the properties known to an object and all its classes. * The property names become the keys in the accumulator hash table * (which is used as a set). * * ---------------------------------------------------------------------- */ static void FindObjectProps( Object *oPtr, /* The object to inspect. Must exist. */ int writable, /* Whether we're after the readable or writable * property set. */ Tcl_HashTable *accumulator) /* Where to gather the names. */ { int i, dummy; Tcl_Obj *propName; Class *mixin; if (writable) { FOREACH(propName, oPtr->properties.writable) { Tcl_CreateHashEntry(accumulator, (void *) propName, &dummy); } } else { FOREACH(propName, oPtr->properties.readable) { Tcl_CreateHashEntry(accumulator, (void *) propName, &dummy); } } FOREACH(mixin, oPtr->mixins) { FindClassProps(mixin, writable, accumulator); } FindClassProps(oPtr->selfCls, writable, accumulator); } /* * ---------------------------------------------------------------------- * * GetAllClassProperties -- * * Get the list of all properties known to a class, including to its * superclasses. Manages a cache so this operation is usually cheap. * The order of properties in the resulting list is undefined. * * ---------------------------------------------------------------------- */ static Tcl_Obj * GetAllClassProperties( Class *clsPtr, /* The class to inspect. Must exist. */ int writable, /* Whether to get writable properties. If * false, readable properties will be returned * instead. */ int *allocated) /* Address of variable to set to true if a * Tcl_Obj was allocated and may be safely * modified by the caller. */ { Tcl_HashTable hashTable; FOREACH_HASH_DECLS; Tcl_Obj *propName, *result; void *dummy; /* * Look in the cache. */ if (clsPtr->properties.epoch == clsPtr->thisPtr->fPtr->epoch) { if (writable) { if (clsPtr->properties.allWritableCache) { *allocated = 0; return clsPtr->properties.allWritableCache; } } else { if (clsPtr->properties.allReadableCache) { *allocated = 0; return clsPtr->properties.allReadableCache; } } } /* * Gather the information. Unsorted! (Caller will sort.) */ *allocated = 1; Tcl_InitObjHashTable(&hashTable); FindClassProps(clsPtr, writable, &hashTable); TclNewObj(result); FOREACH_HASH(propName, dummy, &hashTable) { Tcl_ListObjAppendElement(NULL, result, propName); } Tcl_DeleteHashTable(&hashTable); /* * Cache the information. Also purges the cache. */ if (clsPtr->properties.epoch != clsPtr->thisPtr->fPtr->epoch) { if (clsPtr->properties.allWritableCache) { Tcl_DecrRefCount(clsPtr->properties.allWritableCache); clsPtr->properties.allWritableCache = NULL; } if (clsPtr->properties.allReadableCache) { Tcl_DecrRefCount(clsPtr->properties.allReadableCache); clsPtr->properties.allReadableCache = NULL; } } clsPtr->properties.epoch = clsPtr->thisPtr->fPtr->epoch; if (writable) { clsPtr->properties.allWritableCache = result; } else { clsPtr->properties.allReadableCache = result; } Tcl_IncrRefCount(result); return result; } /* * ---------------------------------------------------------------------- * * SortPropList -- * Sort a list of names of properties. Simple support function. Assumes * that the list Tcl_Obj is unshared and doesn't have a string * representation. * * ---------------------------------------------------------------------- */ static int PropNameCompare( const void *a, const void *b) { Tcl_Obj *first = *(Tcl_Obj **) a; Tcl_Obj *second = *(Tcl_Obj **) b; return TclStringCmp(first, second, 0, 0, TCL_INDEX_NONE); } static inline void SortPropList( Tcl_Obj *list) { Tcl_Size ec; Tcl_Obj **ev; if (Tcl_IsShared(list)) { Tcl_Panic("shared property list cannot be sorted"); } Tcl_ListObjGetElements(NULL, list, &ec, &ev); TclInvalidateStringRep(list); qsort(ev, ec, sizeof(Tcl_Obj *), PropNameCompare); } /* * ---------------------------------------------------------------------- * * TclOOGetAllObjectProperties -- * * Get the sorted list of all properties known to an object, including to * its classes. Manages a cache so this operation is usually cheap. * * ---------------------------------------------------------------------- */ Tcl_Obj * TclOOGetAllObjectProperties( Object *oPtr, /* The object to inspect. Must exist. */ int writable) /* Whether to get writable properties. If * false, readable properties will be returned * instead. */ { Tcl_HashTable hashTable; FOREACH_HASH_DECLS; Tcl_Obj *propName, *result; void *dummy; /* * Look in the cache. */ if (oPtr->properties.epoch == oPtr->fPtr->epoch) { if (writable) { if (oPtr->properties.allWritableCache) { return oPtr->properties.allWritableCache; } } else { if (oPtr->properties.allReadableCache) { return oPtr->properties.allReadableCache; } } } /* * Gather the information. Unsorted! (Caller will sort.) */ Tcl_InitObjHashTable(&hashTable); FindObjectProps(oPtr, writable, &hashTable); TclNewObj(result); FOREACH_HASH(propName, dummy, &hashTable) { Tcl_ListObjAppendElement(NULL, result, propName); } Tcl_DeleteHashTable(&hashTable); SortPropList(result); /* * Cache the information. */ if (oPtr->properties.epoch != oPtr->fPtr->epoch) { if (oPtr->properties.allWritableCache) { Tcl_DecrRefCount(oPtr->properties.allWritableCache); oPtr->properties.allWritableCache = NULL; } if (oPtr->properties.allReadableCache) { Tcl_DecrRefCount(oPtr->properties.allReadableCache); oPtr->properties.allReadableCache = NULL; } } oPtr->properties.epoch = oPtr->fPtr->epoch; if (writable) { oPtr->properties.allWritableCache = result; } else { oPtr->properties.allReadableCache = result; } Tcl_IncrRefCount(result); return result; } /* * ---------------------------------------------------------------------- * * SetPropertyList -- * * Helper for writing a property list (which is actually a set). * * ---------------------------------------------------------------------- */ static inline void SetPropertyList( PropertyList *propList, /* The property list to write. Replaces the * property list's contents. */ Tcl_Size objc, /* Number of property names. */ Tcl_Obj *const objv[]) /* Property names. */ { Tcl_Size i, n; Tcl_Obj *propObj; int created; Tcl_HashTable uniqueTable; for (i=0 ; i<objc ; i++) { Tcl_IncrRefCount(objv[i]); } FOREACH(propObj, *propList) { Tcl_DecrRefCount(propObj); } if (i != objc) { if (objc == 0) { Tcl_Free(propList->list); } else if (i) { propList->list = (Tcl_Obj **) Tcl_Realloc(propList->list, sizeof(Tcl_Obj *) * objc); } else { propList->list = (Tcl_Obj **) Tcl_Alloc(sizeof(Tcl_Obj *) * objc); } } propList->num = 0; if (objc > 0) { Tcl_InitObjHashTable(&uniqueTable); for (i=n=0 ; i<objc ; i++) { Tcl_CreateHashEntry(&uniqueTable, objv[i], &created); if (created) { propList->list[n++] = objv[i]; } else { Tcl_DecrRefCount(objv[i]); } } propList->num = n; /* * Shouldn't be necessary, but maintain num/list invariant. */ if (n != objc) { propList->list = (Tcl_Obj **) Tcl_Realloc(propList->list, sizeof(Tcl_Obj *) * n); } Tcl_DeleteHashTable(&uniqueTable); } } /* * ---------------------------------------------------------------------- * * TclOOInstallReadableProperties -- * * Helper for writing the readable property list (which is actually a set) * that includes flushing the name cache. * * ---------------------------------------------------------------------- */ void TclOOInstallReadableProperties( PropertyStorage *props, /* Which property list to install into. */ Tcl_Size objc, /* Number of property names. */ Tcl_Obj *const objv[]) /* Property names. */ { if (props->allReadableCache) { Tcl_DecrRefCount(props->allReadableCache); props->allReadableCache = NULL; } SetPropertyList(&props->readable, objc, objv); } /* * ---------------------------------------------------------------------- * * TclOOInstallWritableProperties -- * * Helper for writing the writable property list (which is actually a set) * that includes flushing the name cache. * * ---------------------------------------------------------------------- */ void TclOOInstallWritableProperties( PropertyStorage *props, /* Which property list to install into. */ Tcl_Size objc, /* Number of property names. */ Tcl_Obj *const objv[]) /* Property names. */ { if (props->allWritableCache) { Tcl_DecrRefCount(props->allWritableCache); props->allWritableCache = NULL; } SetPropertyList(&props->writable, objc, objv); } /* * ---------------------------------------------------------------------- * * TclOOGetPropertyList -- * * Helper for reading a property list. * * ---------------------------------------------------------------------- */ Tcl_Obj * TclOOGetPropertyList( PropertyList *propList) /* The property list to read. */ { Tcl_Obj *resultObj, *propNameObj; Tcl_Size i; TclNewObj(resultObj); FOREACH(propNameObj, *propList) { Tcl_ListObjAppendElement(NULL, resultObj, propNameObj); } return resultObj; } /* * ---------------------------------------------------------------------- * * TclOOInstallStdPropertyImpls -- * * Validates a (dashless) property name, and installs implementation * methods if asked to do so (readable and writable flags). * * ---------------------------------------------------------------------- */ int TclOOInstallStdPropertyImpls( void *useInstance, Tcl_Interp *interp, Tcl_Obj *propName, int readable, int writable) { const char *name, *reason; Tcl_Size len; char flag = TCL_DONT_QUOTE_HASH; /* * Validate the property name. Note that just calling TclScanElement() is * cheaper than actually formatting a list and comparing the string * version of that with the original, as TclScanElement() is one of the * core parts of doing that; this skips a whole load of irrelevant memory * allocations! */ name = Tcl_GetStringFromObj(propName, &len); if (Tcl_StringMatch(name, "-*")) { reason = "must not begin with -"; goto badProp; } if (TclScanElement(name, len, &flag) != len) { reason = "must be a simple word"; goto badProp; } if (Tcl_StringMatch(name, "*::*")) { reason = "must not contain namespace separators"; goto badProp; } if (Tcl_StringMatch(name, "*[()]*")) { reason = "must not contain parentheses"; goto badProp; } /* * Install the implementations... if asked to do so. */ if (useInstance) { Tcl_Object object = TclOOGetDefineCmdContext(interp); if (!object) { return TCL_ERROR; } ImplementObjectProperty(object, propName, readable, writable); } else { Tcl_Class cls = (Tcl_Class) TclOOGetClassDefineCmdContext(interp); if (!cls) { return TCL_ERROR; } ImplementClassProperty(cls, propName, readable, writable); } return TCL_OK; badProp: Tcl_SetObjResult(interp, Tcl_ObjPrintf( "bad property name \"%s\": %s", name, reason)); Tcl_SetErrorCode(interp, "TCL", "OO", "PROPERTY_FORMAT", NULL); return TCL_ERROR; } /* * ---------------------------------------------------------------------- * * TclOODefinePropertyCmd -- * * Implementation of the "property" definition for classes and instances * governed by the [oo::configurable] metaclass. * * ---------------------------------------------------------------------- */ int TclOODefinePropertyCmd( void *useInstance, /* NULL for class, non-NULL for object. */ Tcl_Interp *interp, /* For error reporting and lookup. */ int objc, /* Number of arguments. */ Tcl_Obj *const *objv) /* Arguments. */ { int i; const char *const options[] = { "-get", "-kind", "-set", NULL }; enum Options { OPT_GET, OPT_KIND, OPT_SET }; const char *const kinds[] = { "readable", "readwrite", "writable", NULL }; enum Kinds { KIND_RO, KIND_RW, KIND_WO }; Object *oPtr = (Object *) TclOOGetDefineCmdContext(interp); if (oPtr == NULL) { return TCL_ERROR; } if (!useInstance && !oPtr->classPtr) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "attempt to misuse API", -1)); Tcl_SetErrorCode(interp, "TCL", "OO", "MONKEY_BUSINESS", (char *)NULL); return TCL_ERROR; } for (i = 1; i < objc; i++) { Tcl_Obj *propObj = objv[i], *nextObj, *argObj, *hyphenated; Tcl_Obj *getterScript = NULL, *setterScript = NULL; /* * Parse the extra options for the property. */ int kind = KIND_RW; while (i + 1 < objc) { int option; nextObj = objv[i + 1]; if (TclGetString(nextObj)[0] != '-') { break; } if (Tcl_GetIndexFromObj(interp, nextObj, options, "option", 0, &option) != TCL_OK) { return TCL_ERROR; } if (i + 2 >= objc) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "missing %s to go with %s option", (option == OPT_KIND ? "kind value" : "body"), options[option])); Tcl_SetErrorCode(interp, "TCL", "WRONGARGS", NULL); return TCL_ERROR; } argObj = objv[i + 2]; i += 2; switch (option) { case OPT_GET: getterScript = argObj; break; case OPT_SET: setterScript = argObj; break; case OPT_KIND: if (Tcl_GetIndexFromObj(interp, argObj, kinds, "kind", 0, &kind) != TCL_OK) { return TCL_ERROR; } break; } } /* * Install the property. Note that TclOOInstallStdPropertyImpls * validates the property name as well. */ if (TclOOInstallStdPropertyImpls(useInstance, interp, propObj, kind != KIND_WO && getterScript == NULL, kind != KIND_RO && setterScript == NULL) != TCL_OK) { return TCL_ERROR; } hyphenated = Tcl_ObjPrintf("-%s", TclGetString(propObj)); if (useInstance) { TclOORegisterInstanceProperty(oPtr, hyphenated, kind != KIND_WO, kind != KIND_RO); } else { TclOORegisterProperty(oPtr->classPtr, hyphenated, kind != KIND_WO, kind != KIND_RO); } Tcl_BounceRefCount(hyphenated); /* * Create property implementation methods by using the right * back-end API, but only if the user has given us the bodies of the * methods we'll make. */ if (getterScript != NULL) { Tcl_Obj *getterName = Tcl_ObjPrintf("<ReadProp-%s>", TclGetString(propObj)); Tcl_Obj *argsPtr = Tcl_NewObj(); Method *mPtr; Tcl_IncrRefCount(getterScript); if (useInstance) { mPtr = TclOONewProcInstanceMethod(interp, oPtr, 0, getterName, argsPtr, getterScript, NULL); } else { mPtr = TclOONewProcMethod(interp, oPtr->classPtr, 0, getterName, argsPtr, getterScript, NULL); } Tcl_BounceRefCount(getterName); Tcl_BounceRefCount(argsPtr); Tcl_DecrRefCount(getterScript); if (mPtr == NULL) { return TCL_ERROR; } } if (setterScript != NULL) { Tcl_Obj *setterName = Tcl_ObjPrintf("<WriteProp-%s>", TclGetString(propObj)); Tcl_Obj *argsPtr; Method *mPtr; TclNewLiteralStringObj(argsPtr, "value"); Tcl_IncrRefCount(setterScript); if (useInstance) { mPtr = TclOONewProcInstanceMethod(interp, oPtr, 0, setterName, argsPtr, setterScript, NULL); } else { mPtr = TclOONewProcMethod(interp, oPtr->classPtr, 0, setterName, argsPtr, setterScript, NULL); } Tcl_BounceRefCount(setterName); Tcl_BounceRefCount(argsPtr); Tcl_DecrRefCount(setterScript); if (mPtr == NULL) { return TCL_ERROR; } } } return TCL_OK; } /* * ---------------------------------------------------------------------- * * TclOOInfoClassPropCmd, TclOOInfoObjectPropCmd -- * * Implements [info class properties $clsName ?$option...?] and * [info object properties $objName ?$option...?] * * ---------------------------------------------------------------------- */ int TclOOInfoClassPropCmd( TCL_UNUSED(void *), Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) { Class *clsPtr; int i, idx, all = 0, writable = 0, allocated = 0; Tcl_Obj *result; if (objc < 2) { Tcl_WrongNumArgs(interp, 1, objv, "className ?options...?"); return TCL_ERROR; } clsPtr = TclOOGetClassFromObj(interp, objv[1]); if (clsPtr == NULL) { return TCL_ERROR; } for (i = 2; i < objc; i++) { if (Tcl_GetIndexFromObj(interp, objv[i], propOptNames, "option", 0, &idx) != TCL_OK) { return TCL_ERROR; } switch (idx) { case PROP_ALL: all = 1; break; case PROP_READABLE: writable = 0; break; case PROP_WRITABLE: writable = 1; break; } } /* * Get the properties. */ if (all) { result = GetAllClassProperties(clsPtr, writable, &allocated); if (allocated) { SortPropList(result); } } else { if (writable) { result = TclOOGetPropertyList(&clsPtr->properties.writable); } else { result = TclOOGetPropertyList(&clsPtr->properties.readable); } SortPropList(result); } Tcl_SetObjResult(interp, result); return TCL_OK; } int TclOOInfoObjectPropCmd( TCL_UNUSED(void *), Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) { Object *oPtr; int i, idx, all = 0, writable = 0; Tcl_Obj *result; if (objc < 2) { Tcl_WrongNumArgs(interp, 1, objv, "objName ?options...?"); return TCL_ERROR; } oPtr = (Object *) Tcl_GetObjectFromObj(interp, objv[1]); if (oPtr == NULL) { return TCL_ERROR; } for (i = 2; i < objc; i++) { if (Tcl_GetIndexFromObj(interp, objv[i], propOptNames, "option", 0, &idx) != TCL_OK) { return TCL_ERROR; } switch (idx) { case PROP_ALL: all = 1; break; case PROP_READABLE: writable = 0; break; case PROP_WRITABLE: writable = 1; break; } } /* * Get the properties. */ if (all) { result = TclOOGetAllObjectProperties(oPtr, writable); } else { if (writable) { result = TclOOGetPropertyList(&oPtr->properties.writable); } else { result = TclOOGetPropertyList(&oPtr->properties.readable); } SortPropList(result); } Tcl_SetObjResult(interp, result); return TCL_OK; } /* * ---------------------------------------------------------------------- * * TclOOReleasePropertyStorage -- * * Delete the memory associated with a class or object's properties. * * ---------------------------------------------------------------------- */ static inline void ReleasePropertyList( PropertyList *propList) { Tcl_Obj *propertyObj; Tcl_Size i; FOREACH(propertyObj, *propList) { Tcl_DecrRefCount(propertyObj); } Tcl_Free(propList->list); propList->list = NULL; propList->num = 0; } void TclOOReleasePropertyStorage( PropertyStorage *propsPtr) { if (propsPtr->allReadableCache) { Tcl_DecrRefCount(propsPtr->allReadableCache); } if (propsPtr->allWritableCache) { Tcl_DecrRefCount(propsPtr->allWritableCache); } if (propsPtr->readable.num) { ReleasePropertyList(&propsPtr->readable); } if (propsPtr->writable.num) { ReleasePropertyList(&propsPtr->writable); } } /* * Local Variables: * mode: c * c-basic-offset: 4 * fill-column: 78 * End: */ |
Changes to generic/tclOOScript.h.
︙ | ︙ | |||
254 255 256 257 258 259 260 | "\t\t\treturn $object\n" "\t\t}\n" "\t}\n" "\tclass create abstract {\n" "\t\tsuperclass class\n" "\t\tunexport create createWithNamespace new\n" "\t}\n" | | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | < < < < < | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | < < < < < < < < < < < < < < < < < < | 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 | "\t\t\treturn $object\n" "\t\t}\n" "\t}\n" "\tclass create abstract {\n" "\t\tsuperclass class\n" "\t\tunexport create createWithNamespace new\n" "\t}\n" "\tnamespace eval configuresupport {\n" "\t\t::namespace eval configurableclass {\n" "\t\t\t::proc properties args {::tailcall property {*}$args}\n" "\t\t\t::namespace path ::oo::define\n" "\t\t\t::namespace export property\n" "\t\t}\n" "\t\t::namespace eval configurableobject {\n" "\t\t\t::proc properties args {::tailcall property {*}$args}\n" "\t\t\t::namespace path ::oo::objdefine\n" "\t\t\t::namespace export property\n" "\t\t}\n" "\t\t::oo::define configurable {\n" "\t\t\tdefinitionnamespace -instance configurableobject\n" "\t\t\tdefinitionnamespace -class configurableclass\n" "\t\t}\n" "\t}\n" "\tclass create configurable {\n" "\t\tsuperclass class\n" "\t\tconstructor {{definitionScript \"\"}} {\n" |
︙ | ︙ |
Changes to generic/tclObj.c.
︙ | ︙ | |||
2079 2080 2081 2082 2083 2084 2085 | goto listRep; } } while ((ParseBoolean(objPtr) == TCL_OK) || (TCL_OK == TclParseNumber(interp, objPtr, (flags & TCL_NULL_OK) ? "boolean value or \"\"" : "boolean value", NULL,-1,NULL,0))); /* Don't try to convert index to a list */ if (!TclHasInternalRep(objPtr, &tclIndexType) | | | 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 | goto listRep; } } while ((ParseBoolean(objPtr) == TCL_OK) || (TCL_OK == TclParseNumber(interp, objPtr, (flags & TCL_NULL_OK) ? "boolean value or \"\"" : "boolean value", NULL,-1,NULL,0))); /* Don't try to convert index to a list */ if (!TclHasInternalRep(objPtr, &tclIndexType) && (TclMaxListLength(Tcl_GetString(objPtr), TCL_INDEX_NONE, NULL) > 1)) { goto listRep; } return TCL_ERROR; } #undef Tcl_GetBooleanFromObj int |
︙ | ︙ | |||
2485 2486 2487 2488 2489 2490 2491 | if (lengthProc && lengthProc(objPtr) != 1) { goto listRep; } } while (SetDoubleFromAny(interp, objPtr) == TCL_OK); /* Don't try to convert index or boolean's to a list */ if (!TclHasInternalRep(objPtr, &tclIndexType) && !TclHasInternalRep(objPtr, &tclBooleanType) | | | 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 | if (lengthProc && lengthProc(objPtr) != 1) { goto listRep; } } while (SetDoubleFromAny(interp, objPtr) == TCL_OK); /* Don't try to convert index or boolean's to a list */ if (!TclHasInternalRep(objPtr, &tclIndexType) && !TclHasInternalRep(objPtr, &tclBooleanType) && (TclMaxListLength(Tcl_GetString(objPtr), TCL_INDEX_NONE, NULL) > 1)) { goto listRep; } return TCL_ERROR; } /* *---------------------------------------------------------------------- |
︙ | ︙ | |||
2791 2792 2793 2794 2795 2796 2797 | goto listRep; } } while (TclParseNumber(interp, objPtr, "integer", NULL, -1, NULL, TCL_PARSE_INTEGER_ONLY)==TCL_OK); /* Don't try to convert index or boolean's to a list */ if (!TclHasInternalRep(objPtr, &tclIndexType) && !TclHasInternalRep(objPtr, &tclBooleanType) | | | 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 | goto listRep; } } while (TclParseNumber(interp, objPtr, "integer", NULL, -1, NULL, TCL_PARSE_INTEGER_ONLY)==TCL_OK); /* Don't try to convert index or boolean's to a list */ if (!TclHasInternalRep(objPtr, &tclIndexType) && !TclHasInternalRep(objPtr, &tclBooleanType) && (TclMaxListLength(Tcl_GetString(objPtr), TCL_INDEX_NONE, NULL) > 1)) { goto listRep; } return TCL_ERROR; } /* *---------------------------------------------------------------------- |
︙ | ︙ | |||
3115 3116 3117 3118 3119 3120 3121 | goto listRep; } } while (TclParseNumber(interp, objPtr, "integer", NULL, -1, NULL, TCL_PARSE_INTEGER_ONLY)==TCL_OK); /* Don't try to convert index or boolean's to a list */ if (!TclHasInternalRep(objPtr, &tclIndexType) && !TclHasInternalRep(objPtr, &tclBooleanType) | | | 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 | goto listRep; } } while (TclParseNumber(interp, objPtr, "integer", NULL, -1, NULL, TCL_PARSE_INTEGER_ONLY)==TCL_OK); /* Don't try to convert index or boolean's to a list */ if (!TclHasInternalRep(objPtr, &tclIndexType) && !TclHasInternalRep(objPtr, &tclBooleanType) && (TclMaxListLength(Tcl_GetString(objPtr), TCL_INDEX_NONE, NULL) > 1)) { goto listRep; } return TCL_ERROR; } /* *---------------------------------------------------------------------- |
︙ | ︙ | |||
3810 3811 3812 3813 3814 3815 3816 | goto listRep; } } while (TCL_OK == TclParseNumber(interp, objPtr, "number", NULL, -1, NULL, 0)); /* Don't try to convert index or boolean's to a list */ if (!TclHasInternalRep(objPtr, &tclIndexType) && !TclHasInternalRep(objPtr, &tclBooleanType) | | | 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 | goto listRep; } } while (TCL_OK == TclParseNumber(interp, objPtr, "number", NULL, -1, NULL, 0)); /* Don't try to convert index or boolean's to a list */ if (!TclHasInternalRep(objPtr, &tclIndexType) && !TclHasInternalRep(objPtr, &tclBooleanType) && (TclMaxListLength(Tcl_GetString(objPtr), TCL_INDEX_NONE, NULL) > 1)) { goto listRep; } return TCL_ERROR; } int Tcl_GetNumber( |
︙ | ︙ |
Changes to generic/tclProc.c.
︙ | ︙ | |||
91 92 93 94 95 96 97 | * * Uses the default behaviour throughout, and never disposes of the string * rep; it's just a cache type. */ static const Tcl_ObjType levelReferenceType = { "levelReference", | > > > > | | 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | * * Uses the default behaviour throughout, and never disposes of the string * rep; it's just a cache type. */ static const Tcl_ObjType levelReferenceType = { "levelReference", NULL, NULL, NULL, NULL, TCL_OBJTYPE_V1(TclLengthOne) }; /* * The type of lambdas. Note that every lambda will *always* have a string * representation. * * Internally, ptr1 is a pointer to a Proc instance that is not bound to a |
︙ | ︙ | |||
2387 2388 2389 2390 2391 2392 2393 | /* *---------------------------------------------------------------------- * * DupLambdaInternalRep, FreeLambdaInternalRep, SetLambdaFromAny -- * * How to manage the internal representations of lambda term objects. * Syntactically they look like a two- or three-element list, where the | | | 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 | /* *---------------------------------------------------------------------- * * DupLambdaInternalRep, FreeLambdaInternalRep, SetLambdaFromAny -- * * How to manage the internal representations of lambda term objects. * Syntactically they look like a two- or three-element list, where the * first element is the formal arguments, the second is the body, and * the (optional) third is the namespace to execute the lambda term * within (the global namespace is assumed if it is absent). * *---------------------------------------------------------------------- */ static void |
︙ | ︙ |
Changes to generic/tclRegexp.c.
︙ | ︙ | |||
942 943 944 945 946 947 948 | /* * Clean up and report errors in the interpreter, if possible. */ Tcl_Free(regexpPtr); if (interp) { TclRegError(interp, | | | 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 | /* * Clean up and report errors in the interpreter, if possible. */ Tcl_Free(regexpPtr); if (interp) { TclRegError(interp, "cannot compile regular expression pattern: ", status); } return NULL; } /* * Convert RE to a glob pattern equivalent, if any, and cache it. If this * is not possible, then globObjPtr will be NULL. This is used by |
︙ | ︙ |
Changes to generic/tclRegexp.h.
︙ | ︙ | |||
33 34 35 36 37 38 39 | Tcl_Obj *globObjPtr; /* Glob pattern rep of RE or NULL if none. */ regmatch_t *matches; /* Array of indices into the Tcl_UniChar * representation of the last string matched * with this regexp to indicate the location * of subexpressions. */ rm_detail_t details; /* Detailed information on match (currently * used only for REG_EXPECT). */ | | | 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | Tcl_Obj *globObjPtr; /* Glob pattern rep of RE or NULL if none. */ regmatch_t *matches; /* Array of indices into the Tcl_UniChar * representation of the last string matched * with this regexp to indicate the location * of subexpressions. */ rm_detail_t details; /* Detailed information on match (currently * used only for REG_EXPECT). */ Tcl_Size refCount; /* Count of number of references to this * compiled regexp. */ } TclRegexp; #endif /* _TCLREGEXP */ /* * Local Variables: |
︙ | ︙ |
Changes to generic/tclStrToD.c.
︙ | ︙ | |||
3170 3171 3172 3173 3174 3175 3176 | if (digit > 10) { Tcl_Panic("wrong digit!"); } b = b % S; /* * Does the current digit put us on the low side of the exact value | | | 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 | if (digit > 10) { Tcl_Panic("wrong digit!"); } b = b % S; /* * Does the current digit put us on the low side of the exact value * but within roundoff of being exact? */ if (b < mplus || (b == mplus && (dPtr->w.word1 & 1) == 0)) { /* * Make sure we shouldn't be rounding *up* instead, in case the * next number above is closer. |
︙ | ︙ | |||
3568 3569 3570 3571 3572 3573 3574 | Tcl_Panic("wrong digit!"); } --b.used; mp_clamp(&b); } /* * Does the current digit put us on the low side of the exact value | | | 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 | Tcl_Panic("wrong digit!"); } --b.used; mp_clamp(&b); } /* * Does the current digit put us on the low side of the exact value * but within roundoff of being exact? */ r1 = mp_cmp_mag(&b, (m2plus > m2minus)? &mplus : &mminus); if (r1 == MP_LT || (r1 == MP_EQ && (dPtr->w.word1 & 1) == 0)) { /* * Make sure we shouldn't be rounding *up* instead, in case the |
︙ | ︙ |
Changes to generic/tclStringObj.c.
︙ | ︙ | |||
593 594 595 596 597 598 599 | int ch = 0; if (index < 0) { return -1; } /* | | | | | 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 | int ch = 0; if (index < 0) { return -1; } /* * Optimize the ByteArray case: no need to convert to a string to * perform the indexing operation. */ if (TclIsPureByteArray(objPtr)) { Tcl_Size length = 0; unsigned char *bytes = Tcl_GetBytesFromObj(NULL, objPtr, &length); if (index >= length) { return -1; } return bytes[index]; } Tcl_Size numChars = TclNumUtfChars(objPtr->bytes, objPtr->length); |
︙ | ︙ | |||
2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 | *p++ = (char) ch; *p = '\0'; TclNewObj(segment); allocSegment = 1; if (!Tcl_AttemptSetObjLength(segment, length)) { msg = overflow; errCode = "OVERFLOW"; goto errorMsg; } bytes = TclGetString(segment); if (!Tcl_AttemptSetObjLength(segment, snprintf(bytes, segment->length, spec, d))) { msg = overflow; errCode = "OVERFLOW"; goto errorMsg; } if (ch == 'A') { char *q = TclGetString(segment) + 1; *q = 'x'; | > > > > > > | 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 | *p++ = (char) ch; *p = '\0'; TclNewObj(segment); allocSegment = 1; if (!Tcl_AttemptSetObjLength(segment, length)) { if (allocSegment) { Tcl_DecrRefCount(segment); } msg = overflow; errCode = "OVERFLOW"; goto errorMsg; } bytes = TclGetString(segment); if (!Tcl_AttemptSetObjLength(segment, snprintf(bytes, segment->length, spec, d))) { if (allocSegment) { Tcl_DecrRefCount(segment); } msg = overflow; errCode = "OVERFLOW"; goto errorMsg; } if (ch == 'A') { char *q = TclGetString(segment) + 1; *q = 'x'; |
︙ | ︙ | |||
3181 3182 3183 3184 3185 3186 3187 | * Non-empty string rep. Not a pure bytearray, so we won't * create a pure bytearray. */ binary = 0; if (ov > objv+1 && ISCONTINUATION(TclGetString(objPtr))) { forceUniChar = 1; | | | 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 | * Non-empty string rep. Not a pure bytearray, so we won't * create a pure bytearray. */ binary = 0; if (ov > objv+1 && ISCONTINUATION(TclGetString(objPtr))) { forceUniChar = 1; } else if ((objPtr->typePtr) && !TclHasInternalRep(objPtr, &tclStringType)) { /* Prevent shimmer of non-string types. */ allowUniChar = 0; } } } else { binary = 0; if (TclHasInternalRep(objPtr, &tclStringType)) { |
︙ | ︙ |
Changes to generic/tclTest.c.
︙ | ︙ | |||
932 933 934 935 936 937 938 | for (asyncPtr = firstHandler; asyncPtr != NULL; asyncPtr = asyncPtr->nextPtr) { if (asyncPtr->id == id) { Tcl_ThreadId threadID; if (Tcl_CreateThread(&threadID, AsyncThreadProc, INT2PTR(id), TCL_THREAD_STACK_DEFAULT, TCL_THREAD_NOFLAGS) != TCL_OK) { | | | 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 | for (asyncPtr = firstHandler; asyncPtr != NULL; asyncPtr = asyncPtr->nextPtr) { if (asyncPtr->id == id) { Tcl_ThreadId threadID; if (Tcl_CreateThread(&threadID, AsyncThreadProc, INT2PTR(id), TCL_THREAD_STACK_DEFAULT, TCL_THREAD_NOFLAGS) != TCL_OK) { Tcl_AppendResult(interp, "cannot create thread", (char *)NULL); Tcl_MutexUnlock(&asyncTestMutex); return TCL_ERROR; } break; } } Tcl_MutexUnlock(&asyncTestMutex); |
︙ | ︙ | |||
2069 2070 2071 2072 2073 2074 2075 | * as otherwise there is no script level command that directly exercises * these functions (i/o command cannot test all combinations) * The arguments at the script level are roughly those of the above * functions: * encodingname srcbytes flags state dstlen ?srcreadvar? ?dstwrotevar? ?dstcharsvar? * * Results: | | | | < | | 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 | * as otherwise there is no script level command that directly exercises * these functions (i/o command cannot test all combinations) * The arguments at the script level are roughly those of the above * functions: * encodingname srcbytes flags state dstlen ?srcreadvar? ?dstwrotevar? ?dstcharsvar? * * Results: * TCL_OK or TCL_ERROR. This indicates any errors running the test, NOT the * result of Tcl_UtfToExternal or Tcl_ExternalToUtf. * * Side effects: * * The result in the interpreter is a list of the return code from the * Tcl_UtfToExternal/Tcl_ExternalToUtf functions, the encoding state, and * an encoded binary string of length dstLen. Note the string is the * entire output buffer, not just the part containing the decoded * portion. This allows for additional checks at test script level. * * If any of the srcreadvar, dstwrotevar and dstcharsvar are specified and * not empty, they are treated as names of variables where the *srcRead, * *dstWrote and *dstChars output from the functions are stored. * * The function also checks internally whether nuls are correctly * appended as requested but the TCL_ENCODING_NO_TERMINATE flag * and that no buffer overflows occur. *------------------------------------------------------------------------ */ typedef int |
︙ | ︙ | |||
2117 2118 2119 2120 2121 2122 2123 | const char *flagKey; int flag; } flagMap[] = { {"start", TCL_ENCODING_START}, {"end", TCL_ENCODING_END}, {"noterminate", TCL_ENCODING_NO_TERMINATE}, {"charlimit", TCL_ENCODING_CHAR_LIMIT}, | | | | | 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 | const char *flagKey; int flag; } flagMap[] = { {"start", TCL_ENCODING_START}, {"end", TCL_ENCODING_END}, {"noterminate", TCL_ENCODING_NO_TERMINATE}, {"charlimit", TCL_ENCODING_CHAR_LIMIT}, {"tcl8", TCL_ENCODING_PROFILE_TCL8}, {"strict", TCL_ENCODING_PROFILE_STRICT}, {"replace", TCL_ENCODING_PROFILE_REPLACE}, {NULL, 0} }; Tcl_Size i; Tcl_WideInt wide; if (objc < 7 || objc > 10) { Tcl_WrongNumArgs(interp, 2, objv, |
︙ | ︙ | |||
2216 2217 2218 2219 2220 2221 2222 | bytes = Tcl_GetByteArrayFromObj(objv[3], &srcLen); /* Last! to avoid shimmering */ result = (*transformer)(interp, encoding, (const char *)bytes, srcLen, flags, encStatePtr, (char *) bufPtr, dstLen, srcReadVar ? &srcRead : NULL, &dstWrote, dstCharsVar ? &dstChars : NULL); if (memcmp(bufPtr + bufLen - 4, "\xAB\xCD\xEF\xAB", 4)) { | | | | > | 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 | bytes = Tcl_GetByteArrayFromObj(objv[3], &srcLen); /* Last! to avoid shimmering */ result = (*transformer)(interp, encoding, (const char *)bytes, srcLen, flags, encStatePtr, (char *) bufPtr, dstLen, srcReadVar ? &srcRead : NULL, &dstWrote, dstCharsVar ? &dstChars : NULL); if (memcmp(bufPtr + bufLen - 4, "\xAB\xCD\xEF\xAB", 4)) { Tcl_SetObjResult(interp, Tcl_ObjPrintf("%s wrote past output buffer", transformer == Tcl_ExternalToUtf ? "Tcl_ExternalToUtf" : "Tcl_UtfToExternal")); result = TCL_ERROR; } else if (result != TCL_ERROR) { Tcl_Obj *resultObjs[3]; switch (result) { case TCL_OK: resultObjs[0] = Tcl_NewStringObj("ok", TCL_INDEX_NONE); break; |
︙ | ︙ | |||
8374 8375 8376 8377 8378 8379 8380 | * - To determine the name of the caller proc, the proc is taken * from the topmost stack frame. * * - Note that the context is NOT provided during byte-code * compilation (e.g. in TclProcCompileProc) * * When these conditions hold, this function resolves the | | | 8374 8375 8376 8377 8378 8379 8380 8381 8382 8383 8384 8385 8386 8387 8388 | * - To determine the name of the caller proc, the proc is taken * from the topmost stack frame. * * - Note that the context is NOT provided during byte-code * compilation (e.g. in TclProcCompileProc) * * When these conditions hold, this function resolves the * passed-in cmd literal into a cmd "y", which is taken from * the global namespace (for simplicity). */ const char *callingCmdName = Tcl_GetCommandName(interp, (Tcl_Command) procPtr->cmdPtr); if ( callingCmdName[0] == 'x' && callingCmdName[1] == '\0' ) { |
︙ | ︙ | |||
8400 8401 8402 8403 8404 8405 8406 | * from the 2nd highest stack frame. * * - Note that the context can be provided during byte-code * compilation (e.g. in TclProcCompileProc) * * When these conditions hold, this function resolves the * passed-in cmd literal into a cmd "y" or "Y" depending on the | | | 8400 8401 8402 8403 8404 8405 8406 8407 8408 8409 8410 8411 8412 8413 8414 | * from the 2nd highest stack frame. * * - Note that the context can be provided during byte-code * compilation (e.g. in TclProcCompileProc) * * When these conditions hold, this function resolves the * passed-in cmd literal into a cmd "y" or "Y" depending on the * context. The resolved procs are taken from the global * namespace (for simplicity). */ CallFrame *parentFramePtr = varFramePtr->callerPtr; const char *context = parentFramePtr != NULL ? parentFramePtr->nsPtr->name : "(NULL)"; if (strcmp(context, "ctx1") == 0 && (name[0] == 'z') && (name[1] == '\0')) { |
︙ | ︙ |
Changes to generic/tclTestABSList.c.
︙ | ︙ | |||
476 477 478 479 480 481 482 | } /* *---------------------------------------------------------------------- * * my_LStringObjReverse -- * | | | 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 | } /* *---------------------------------------------------------------------- * * my_LStringObjReverse -- * * Creates a new Obj with the order of the elements in the lstring * value reversed, where first is last and last is first, etc. * * Results: * A new Obj is assigned to newObjPtr. Returns TCL_OK * * Side effects: * A new Obj is created. |
︙ | ︙ |
Changes to generic/tclThreadAlloc.c.
︙ | ︙ | |||
65 66 67 68 69 70 71 | #define sourceBucket b.u.s.bucket #define magicNum1 b.u.s.magic1 #define magicNum2 b.u.s.magic2 #define MAGIC 0xEF #define blockReqSize b.reqSize /* | | | 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | #define sourceBucket b.u.s.bucket #define magicNum1 b.u.s.magic1 #define magicNum2 b.u.s.magic2 #define MAGIC 0xEF #define blockReqSize b.reqSize /* * The following defines the minimum and maximum block sizes and the number * of buckets in the bucket cache. */ #define MINALLOC ((sizeof(Block) + 8 + (TCL_ALLOCALIGN-1)) & ~(TCL_ALLOCALIGN-1)) #define NBUCKETS (11 - (MINALLOC >> 5)) #define MAXALLOC (MINALLOC << (NBUCKETS - 1)) |
︙ | ︙ |
Changes to generic/tclThreadTest.c.
︙ | ︙ | |||
505 506 507 508 509 510 511 | joinable = joinable ? TCL_THREAD_JOINABLE : TCL_THREAD_NOFLAGS; Tcl_MutexLock(&threadMutex); if (Tcl_CreateThread(&id, NewTestThread, &ctrl, TCL_THREAD_STACK_DEFAULT, joinable) != TCL_OK) { Tcl_MutexUnlock(&threadMutex); | | | 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 | joinable = joinable ? TCL_THREAD_JOINABLE : TCL_THREAD_NOFLAGS; Tcl_MutexLock(&threadMutex); if (Tcl_CreateThread(&id, NewTestThread, &ctrl, TCL_THREAD_STACK_DEFAULT, joinable) != TCL_OK) { Tcl_MutexUnlock(&threadMutex); Tcl_AppendResult(interp, "cannot create a new thread", (char *)NULL); return TCL_ERROR; } /* * Wait for the thread to start because it is using something on our stack! */ |
︙ | ︙ |
Changes to generic/tclTrace.c.
︙ | ︙ | |||
1451 1452 1453 1454 1455 1456 1457 | if (tracePtr->level > 0 && curLevel > tracePtr->level) { continue; } if (!(tracePtr->flags & TCL_TRACE_EXEC_IN_PROGRESS)) { /* | | | 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 | if (tracePtr->level > 0 && curLevel > tracePtr->level) { continue; } if (!(tracePtr->flags & TCL_TRACE_EXEC_IN_PROGRESS)) { /* * The proc invoked might delete the traced command which * might try to free tracePtr. We want to use tracePtr until the * end of this if section, so we use Tcl_Preserve() and * Tcl_Release() to be sure it is not freed while we still need * it. */ Tcl_Preserve(tracePtr); |
︙ | ︙ |
Changes to generic/tclUniData.c.
︙ | ︙ | |||
196 197 198 199 200 201 202 | 10304, 10336, 10368, 1344, 1344, 1344, 10400, 10432, 64, 10464, 10496, 10528, 4736, 10560, 10592 #if TCL_UTF_MAX > 3 || TCL_MAJOR_VERSION > 8 || TCL_MINOR_VERSION > 6 ,10624, 10656, 10688, 3296, 1344, 1344, 1344, 10720, 10752, 10784, 10816, 10848, 10880, 10912, 8032, 10944, 3296, 3296, 3296, 3296, 9216, 1344, 10976, 11008, 1344, 11040, 11072, 11104, 11136, 1344, 11168, 3296, 11200, 11232, 11264, 1344, 11296, 11328, 11360, 11392, 1344, | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > | | > > > > > > > > > > > > > > > > > > > > | | > > > > > > | | | | > > > > > > > > > > > > | > > > > > | | > | | | > > > | > > | > > | > > > > > > > > | > > | | | < < < < < < | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | < | < < < < < < < < < < < < < < < < < < < < < < < < | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 | 10304, 10336, 10368, 1344, 1344, 1344, 10400, 10432, 64, 10464, 10496, 10528, 4736, 10560, 10592 #if TCL_UTF_MAX > 3 || TCL_MAJOR_VERSION > 8 || TCL_MINOR_VERSION > 6 ,10624, 10656, 10688, 3296, 1344, 1344, 1344, 10720, 10752, 10784, 10816, 10848, 10880, 10912, 8032, 10944, 3296, 3296, 3296, 3296, 9216, 1344, 10976, 11008, 1344, 11040, 11072, 11104, 11136, 1344, 11168, 3296, 11200, 11232, 11264, 1344, 11296, 11328, 11360, 11392, 1344, 11424, 1344, 11456, 11488, 11520, 1344, 11552, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 7776, 4704, 11584, 11616, 11648, 3296, 3296, 11680, 11712, 11744, 11776, 4736, 11808, 3296, 11840, 11872, 11904, 3296, 3296, 1344, 11936, 11968, 6880, 12000, 12032, 12064, 12096, 12128, 3296, 12160, 12192, 1344, 12224, 12256, 12288, 12320, 12352, 3296, 3296, 1344, 1344, 12384, 3296, 12416, 12448, 12480, 12512, 1344, 12544, 12576, 12608, 12640, 3296, 3296, 3296, 3296, 3296, 3296, 12672, 1344, 12704, 12736, 12768, 12128, 12800, 12832, 12864, 12896, 12864, 12928, 7776, 12960, 12992, 13024, 13056, 5280, 13088, 13120, 13152, 13184, 13216, 13248, 13280, 5280, 13312, 13344, 13376, 13408, 13440, 13472, 3296, 13504, 13536, 13568, 13600, 13632, 13664, 13696, 13728, 13760, 13792, 13824, 13856, 1344, 13888, 13920, 13952, 1344, 13984, 14016, 3296, 3296, 3296, 3296, 3296, 1344, 14048, 14080, 3296, 1344, 14112, 14144, 14176, 1344, 14208, 14240, 14272, 14304, 14336, 14368, 3296, 3296, 3296, 3296, 3296, 1344, 14400, 3296, 3296, 3296, 14432, 14464, 14496, 14528, 14560, 14592, 3296, 3296, 14624, 14656, 14688, 14720, 14752, 14784, 1344, 14816, 14848, 1344, 4608, 14880, 3296, 3296, 3296, 3296, 3296, 1344, 14912, 14944, 14976, 15008, 15040, 15072, 15104, 3296, 3296, 15136, 15168, 15200, 15232, 15264, 15296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 15328, 15360, 15392, 15424, 3296, 3296, 15456, 15488, 15520, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 9920, 3296, 3296, 3296, 10816, 10816, 10816, 15552, 1344, 1344, 1344, 1344, 1344, 1344, 15584, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 12864, 1344, 1344, 15616, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 15648, 15680, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 10720, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 14368, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 15712, 15744, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 4608, 4736, 15776, 1344, 4736, 15808, 15840, 1344, 15872, 15904, 15936, 15968, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 16000, 16032, 3296, 3296, 3296, 3296, 3296, 3296, 14432, 14464, 16064, 3296, 3296, 3296, 1344, 1344, 16096, 16128, 16160, 3296, 3296, 16192, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 16224, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 4704, 16256, 12384, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 16288, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 16320, 16352, 16384, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 9792, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 1344, 1344, 1344, 16416, 16448, 16480, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 16512, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 7968, 3296, 3296, 704, 16544, 16576, 4928, 4928, 4928, 16608, 3296, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 8000, 4928, 16640, 4928, 16672, 16704, 16736, 4928, 6848, 4928, 4928, 16768, 3296, 3296, 3296, 16800, 16800, 4928, 4928, 16832, 16864, 3296, 3296, 3296, 3296, 16896, 16928, 16960, 16992, 17024, 17056, 17088, 17120, 17152, 17184, 17216, 17248, 17280, 16896, 16928, 17312, 16992, 17344, 17376, 17408, 17120, 17440, 17472, 17504, 17536, 17568, 17600, 17632, 17664, 17696, 17728, 17760, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 704, 17792, 704, 17824, 17856, 17888, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 17920, 17952, 3296, 3296, 3296, 3296, 3296, 3296, 17984, 18016, 5664, 18048, 18080, 3296, 3296, 3296, 1344, 18112, 18144, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 12864, 18176, 1344, 18208, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 12864, 18240, 3296, 3296, 3296, 3296, 3296, 3296, 12864, 18272, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 18304, 1344, 1344, 1344, 1344, 1344, 1344, 18336, 3296, 18368, 18400, 18432, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 18464, 6880, 18496, 3296, 3296, 18528, 18560, 3296, 3296, 3296, 3296, 3296, 3296, 18592, 18624, 18656, 18688, 18720, 18752, 3296, 18784, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 4928, 18816, 4928, 4928, 7968, 18848, 18880, 8000, 18912, 4928, 4928, 4928, 4928, 18944, 3296, 18976, 19008, 19040, 19072, 19104, 3296, 3296, 3296, 3296, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 19136, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 19168, 19200, 4928, 4928, 4928, 19232, 4928, 4928, 19264, 19296, 18816, 4928, 19328, 4928, 19360, 19392, 19424, 3296, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 7968, 19456, 19488, 4928, 19520, 19552, 4928, 4928, 4928, 4928, 19584, 4928, 4928, 16512, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 3296, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 9920, 1344, 1344, 1344, 1344, 1344, 1344, 11296, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 19616, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 19648, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 11296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 11296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 3296, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1792, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 15968 #endif /* TCL_UTF_MAX > 3 */ }; /* * The groupMap is indexed by combining the alternate page number with * the page offset and returns a group number that identifies a unique * set of character attributes. |
︙ | ︙ | |||
596 597 598 599 600 601 602 | 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 25, 26, 23, 24, 23, 24, 23, 24, 21, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 21, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 27, 23, 24, 23, 24, 23, 24, 28, 29, 30, 23, 24, 23, 24, 31, 23, 24, 32, 32, 23, 24, 21, 33, 34, 35, 23, 24, 32, 36, 37, 38, 39, 23, 24, 40, | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 | 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 25, 26, 23, 24, 23, 24, 23, 24, 21, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 21, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 27, 23, 24, 23, 24, 23, 24, 28, 29, 30, 23, 24, 23, 24, 31, 23, 24, 32, 32, 23, 24, 21, 33, 34, 35, 23, 24, 32, 36, 37, 38, 39, 23, 24, 40, 41, 38, 42, 43, 44, 23, 24, 23, 24, 23, 24, 45, 23, 24, 45, 21, 21, 23, 24, 45, 23, 24, 46, 46, 23, 24, 23, 24, 47, 23, 24, 21, 15, 23, 24, 21, 48, 15, 15, 15, 15, 49, 50, 51, 49, 50, 51, 49, 50, 51, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 52, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 21, 49, 50, 51, 23, 24, 53, 54, 23, 24, 23, 24, 23, 24, 23, 24, 55, 21, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 21, 21, 21, 21, 21, 21, 56, 23, 24, 57, 58, 59, 59, 23, 24, 60, 61, 62, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 63, 64, 65, 66, 67, 21, 68, 68, 21, 69, 21, 70, 71, 21, 21, 21, 68, 72, 21, 73, 74, 75, 76, 21, 77, 78, 76, 79, 80, 21, 21, 78, 21, 81, 82, 21, 21, 83, 21, 21, 21, 21, 21, 21, 21, 84, 21, 21, 85, 21, 86, 85, 21, 21, 21, 87, 85, 88, 89, 89, 90, 21, 21, 21, 21, 21, 91, 21, 15, 21, 21, 21, 21, 21, 21, 21, 21, 92, 93, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 11, 11, 11, 11, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 94, 94, 94, 94, 94, 11, 11, 11, 11, 11, 11, 11, 94, 11, 94, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 96, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 23, 24, 23, 24, 94, 11, 23, 24, 0, 0, 94, 43, 43, 43, 3, 97, 0, 0, 0, 0, 11, 11, 98, 3, 99, 99, 99, 0, 100, 0, 101, 101, 21, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 102, 103, 103, 103, 21, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 104, 13, 13, 13, 13, 13, 13, 13, 13, 13, 105, 106, 106, 107, 108, 109, 110, 110, 110, 111, 112, 113, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 114, 115, 116, 117, 118, 119, 7, 23, 24, 120, 23, 24, 21, 55, 55, 55, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 23, 24, 14, 95, 95, 95, 95, 95, 122, 122, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 123, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 124, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 0, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 0, 0, 94, 3, 3, 3, 3, 3, 3, 21, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 21, 21, 3, 8, 0, 0, 14, 14, 4, 0, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 8, 95, 3, 95, 95, 3, 95, 95, 3, 95, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 15, 15, 15, 15, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 17, 17, 17, 7, 7, 7, 3, 3, 4, 3, 3, 14, 14, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 3, 17, 3, 3, 3, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 94, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 3, 3, 3, 3, 15, 15, 95, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 3, 15, 95, 95, 95, 95, 95, 95, 95, 17, 14, 95, 95, 95, 95, 95, 95, 94, 94, 95, 95, 14, 95, 95, 95, 95, 15, 15, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 15, 15, 15, 14, 14, 15, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 17, 15, 95, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 95, 95, 95, 95, 95, 95, 95, 95, 95, 94, 94, 14, 3, 3, 3, 94, 0, 0, 95, 4, 4, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 95, 95, 95, 95, 94, 95, 95, 95, 95, 95, 95, 95, 95, 95, 94, 95, 95, 95, 94, 95, 95, 95, 95, 95, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 95, 95, 95, 0, 0, 3, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 11, 15, 15, 15, 15, 15, 15, 0, 17, 17, 0, 0, 0, 0, 0, 95, 95, 95, 95, 95, 95, 95, 95, 95, 15, 15, 15, 15, 15, 15, 15, 15, 15, 94, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 17, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 127, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 95, 127, 95, 15, 127, 127, 127, 95, 95, 95, 95, 95, 95, 95, 95, 127, 127, 127, 127, 95, 127, 127, 15, 95, 95, 95, 95, 95, 95, 95, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 95, 95, 3, 3, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 3, 94, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 95, 127, 127, 0, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 15, 15, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 0, 15, 0, 0, 0, 15, 15, 15, 15, 0, 0, 95, 15, 127, 127, 127, 95, 95, 95, 95, 0, 0, 127, 127, 0, 0, 127, 127, 95, 15, 0, 0, 0, 0, 0, 0, 0, 0, 127, 0, 0, 0, 0, 15, 15, 0, 15, 15, 15, 95, 95, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 15, 15, 4, 4, 18, 18, 18, 18, 18, 18, 14, 4, 15, 3, 95, 0, 0, 95, 95, 127, 0, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 15, 15, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 0, 15, 15, 0, 15, 15, 0, 0, 95, 0, 127, 127, 127, 95, 95, 0, 0, 0, 0, 95, 95, 0, 0, 95, 95, 95, 0, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 0, 15, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 95, 95, 15, 15, 15, 95, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 95, 127, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 0, 15, 15, 15, 15, 15, 0, 0, 95, 15, 127, 127, 127, 95, 95, 95, 95, 95, 0, 95, 95, 127, 0, 127, 127, 95, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 95, 95, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 3, 4, 0, 0, 0, 0, 0, 0, 0, 15, 95, 95, 95, 95, 95, 95, 0, 95, 127, 127, 0, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 15, 15, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 0, 15, 15, 15, 15, 15, 0, 0, 95, 15, 127, 95, 127, 95, 95, 95, 95, 0, 0, 127, 127, 0, 0, 127, 127, 95, 0, 0, 0, 0, 0, 0, 0, 95, 95, 127, 0, 0, 0, 0, 15, 15, 0, 15, 15, 15, 95, 95, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 14, 15, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 15, 0, 15, 15, 15, 15, 15, 15, 0, 0, 0, 15, 15, 15, 0, 15, 15, 15, 15, 0, 0, 0, 15, 15, 0, 15, 0, 15, 15, 0, 0, 0, 15, 15, 0, 0, 0, 15, 15, 15, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 127, 127, 95, 127, 127, 0, 0, 0, 127, 127, 127, 0, 127, 127, 127, 95, 0, 0, 15, 0, 0, 0, 0, 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 18, 18, 14, 14, 14, 14, 14, 14, 4, 14, 0, 0, 0, 0, 0, 95, 127, 127, 127, 95, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 95, 15, 95, 95, 95, 127, 127, 127, 127, 0, 95, 95, 95, 0, 95, 95, 95, 95, 0, 0, 0, 0, 0, 0, 0, 95, 95, 0, 15, 15, 15, 0, 0, 15, 0, 0, 15, 15, 95, 95, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 3, 18, 18, 18, 18, 18, 18, 18, 14, 15, 95, 127, 127, 3, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 0, 0, 95, 15, 127, 95, 127, 127, 127, 127, 127, 0, 95, 127, 127, 0, 127, 127, 95, 95, 0, 0, 0, 0, 0, 0, 0, 127, 127, 0, 0, 0, 0, 0, 0, 15, 15, 0, 15, 15, 95, 95, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 15, 15, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 95, 127, 127, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 95, 95, 15, 127, 127, 127, 95, 95, 95, 95, 0, 127, 127, 127, 0, 127, 127, 127, 95, 15, 14, 0, 0, 0, 0, 15, 15, 15, 127, 18, 18, 18, 18, 18, 18, 18, 15, 15, 15, 95, 95, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 18, 18, 18, 18, 18, 18, 18, 18, 14, 15, 15, 15, 15, 15, 15, 0, 95, 127, 127, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 0, 0, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 95, 0, 0, 0, 0, 127, 127, 127, 95, 95, 95, 0, 95, 0, 127, 127, 127, 127, 127, 127, 127, 127, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 127, 127, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 95, 15, 15, 95, 95, 95, 95, 95, 95, 95, 0, 0, 0, 0, 4, 15, 15, 15, 15, 15, 15, 94, 95, 95, 95, 95, 95, 95, 95, 95, 3, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 0, 15, 0, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 95, 15, 15, 95, 95, 95, 95, 95, 95, 95, 95, 95, 15, 0, 0, 15, 15, 15, 15, 15, 0, 94, 0, 95, 95, 95, 95, 95, 95, 95, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 15, 15, 15, 15, 15, 14, 14, 14, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 14, 3, 14, 14, 14, 95, 95, 14, 14, 14, 14, 14, 14, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 14, 95, 14, 95, 14, 95, 5, 6, 5, 6, 127, 127, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 127, 95, 95, 95, 95, 95, 3, 95, 95, 15, 15, 15, 15, 15, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 0, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 0, 14, 14, 14, 14, 14, 14, 14, 14, 95, 14, 14, 14, 14, 14, 14, 0, 14, 14, 3, 3, 3, 3, 3, 14, 14, 14, 14, 3, 3, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 127, 127, 95, 95, 95, 95, 127, 95, 95, 95, 95, 95, 95, 127, 95, 95, 127, 127, 95, 95, 15, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 3, 3, 3, 3, 3, 3, 15, 15, 15, 15, 15, 15, 127, 127, 95, 95, 15, 15, 15, 15, 95, 95, 95, 15, 127, 127, 127, 15, 15, 127, 127, 127, 127, 127, 127, 127, 15, 15, 15, 95, 95, 95, 95, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 95, 127, 127, 95, 95, 127, 127, 127, 127, 127, 127, 95, 15, 127, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 127, 127, 127, 95, 14, 14, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 128, 0, 0, 0, 0, 0, 128, 0, 0, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 3, 94, 129, 129, 129, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 0, 0, 15, 15, 15, 15, 15, 15, 15, 0, 15, 0, 15, 15, 15, 15, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 0, 0, 15, 15, 15, 15, 15, 15, 15, 0, 15, 0, 15, 15, 15, 15, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 95, 95, 95, 3, 3, 3, 3, 3, 3, 3, 3, 3, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 107, 107, 107, 107, 107, 107, 0, 0, 113, 113, 113, 113, 113, 113, 0, 0, 8, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 3, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 2, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 5, 6, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 3, 3, 3, 131, 131, 131, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 95, 95, 95, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 95, 95, 127, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 95, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 0, 95, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 95, 95, 127, 95, 95, 95, 95, 95, 95, 95, 127, 127, 127, 127, 127, 127, 127, 127, 95, 127, 127, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 3, 3, 3, 94, 3, 3, 3, 4, 15, 95, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 8, 3, 3, 3, 3, 95, 95, 95, 17, 95, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 15, 15, 15, 94, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 95, 95, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 95, 15, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 95, 95, 95, 127, 127, 127, 127, 95, 95, 127, 127, 127, 0, 0, 0, 0, 127, 127, 95, 127, 127, 127, 127, 127, 127, 95, 95, 95, 0, 0, 0, 0, 14, 0, 0, 0, 3, 3, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 95, 95, 127, 127, 95, 0, 0, 3, 3, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 127, 95, 127, 95, 95, 95, 95, 95, 95, 95, 0, 95, 127, 95, 127, 127, 95, 95, 95, 95, 95, 95, 95, 95, 127, 127, 127, 127, 127, 127, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 0, 0, 95, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 94, 3, 3, 3, 3, 3, 3, 0, 0, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 122, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 95, 95, 95, 127, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 95, 127, 95, 95, 95, 95, 95, 127, 95, 127, 127, 127, 127, 127, 95, 127, 127, 15, 15, 15, 15, 15, 15, 15, 15, 0, 3, 3, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 3, 3, 3, 3, 3, 3, 3, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 95, 95, 95, 95, 95, 95, 95, 95, 95, 14, 14, 14, 14, 14, 14, 14, 14, 14, 3, 3, 3, 95, 95, 127, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 127, 95, 95, 95, 95, 127, 127, 95, 95, 127, 95, 95, 95, 15, 15, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 95, 127, 95, 95, 127, 127, 127, 95, 127, 95, 95, 95, 127, 127, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 15, 15, 15, 15, 127, 127, 127, 127, 127, 127, 127, 127, 95, 95, 95, 95, 95, 95, 95, 95, 127, 127, 95, 95, 0, 0, 0, 3, 3, 3, 3, 3, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 15, 15, 15, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 94, 94, 94, 94, 94, 94, 3, 3, 132, 133, 134, 135, 135, 136, 137, 138, 139, 23, 24, 0, 0, 0, 0, 0, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 0, 0, 140, 140, 140, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 95, 95, 95, 3, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 127, 95, 95, 95, 95, 95, 95, 95, 15, 15, 15, 15, 95, 15, 15, 15, 15, 15, 15, 95, 15, 15, 127, 95, 95, 15, 0, 0, 0, 0, 0, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 94, 141, 21, 21, 21, 142, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 143, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 94, 94, 94, 94, 94, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 21, 21, 21, 21, 21, 144, 21, 21, 145, 21, 146, 146, 146, 146, 146, 146, 146, 146, 147, 147, 147, 147, 147, 147, 147, 147, 146, 146, 146, 146, 146, 146, 0, 0, 147, 147, 147, 147, 147, 147, 0, 0, 146, 146, 146, 146, 146, 146, 146, 146, 147, 147, 147, 147, 147, 147, 147, 147, 146, 146, 146, 146, 146, 146, 146, 146, 147, 147, 147, 147, 147, 147, 147, 147, 146, 146, 146, 146, 146, 146, 0, 0, 147, 147, 147, 147, 147, 147, 0, 0, 21, 146, 21, 146, 21, 146, 21, 146, 0, 147, 0, 147, 0, 147, 0, 147, 146, 146, 146, 146, 146, 146, 146, 146, 147, 147, 147, 147, 147, 147, 147, 147, 148, 148, 149, 149, 149, 149, 150, 150, 151, 151, 152, 152, 153, 153, 0, 0, 146, 146, 146, 146, 146, 146, 146, 146, 154, 154, 154, 154, 154, 154, 154, 154, 146, 146, 146, 146, 146, 146, 146, 146, 154, 154, 154, 154, 154, 154, 154, 154, 146, 146, 146, 146, 146, 146, 146, 146, 154, 154, 154, 154, 154, 154, 154, 154, 146, 146, 21, 155, 21, 0, 21, 21, 147, 147, 156, 156, 157, 11, 158, 11, 11, 11, 21, 155, 21, 0, 21, 21, 159, 159, 159, 159, 157, 11, 11, 11, 146, 146, 21, 21, 0, 0, 21, 21, 147, 147, 160, 160, 0, 11, 11, 11, 146, 146, 21, 21, 21, 116, 21, 21, 147, 147, 161, 161, 120, 11, 11, 11, 0, 0, 21, 155, 21, 0, 21, 21, 162, 162, 163, 163, 157, 11, 11, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 17, 17, 17, 17, 17, 8, 8, 8, 8, 8, 8, 3, 3, 16, 20, 5, 16, 16, 20, 5, 16, 3, 3, 3, 3, 3, 3, 3, 3, 164, 165, 17, 17, 17, 17, 17, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 16, 20, 3, 3, 3, 3, 12, 12, 3, 3, 3, 7, 5, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 12, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 17, 17, 17, 17, 17, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 94, 0, 0, 18, 18, 18, 18, 18, 18, 7, 7, 7, 5, 6, 94, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 7, 7, 7, 5, 6, 0, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 122, 122, 122, 122, 95, 122, 122, 122, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 110, 14, 14, 14, 14, 110, 14, 14, 21, 110, 110, 110, 21, 21, 110, 110, 110, 21, 14, 110, 14, 14, 7, 110, 110, 110, 110, 110, 14, 14, 14, 14, 14, 14, 110, 14, 166, 14, 110, 14, 167, 168, 110, 110, 14, 21, 110, 110, 169, 110, 21, 15, 15, 15, 15, 21, 14, 14, 21, 21, 110, 110, 7, 7, 7, 7, 7, 110, 21, 21, 21, 21, 14, 7, 14, 14, 170, 14, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 131, 131, 131, 23, 24, 131, 131, 131, 131, 18, 14, 14, 0, 0, 0, 0, 7, 7, 7, 7, 7, 14, 14, 14, 14, 14, 7, 7, 14, 14, 14, 14, 7, 14, 14, 7, 14, 14, 7, 14, 14, 14, 14, 14, 14, 14, 7, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 7, 7, 14, 14, 7, 14, 7, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 14, 14, 14, 14, 14, 14, 14, 14, 5, 6, 5, 6, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 7, 7, 14, 14, 14, 14, 14, 14, 14, 5, 6, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 7, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 7, 7, 7, 7, 7, 7, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 7, 14, 14, 14, 14, 14, 14, 14, 14, 14, 7, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 7, 7, 7, 7, 7, 7, 7, 7, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, |
︙ | ︙ | |||
1000 1001 1002 1003 1004 1005 1006 | 7, 7, 7, 7, 7, 7, 7, 5, 6, 7, 7, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 14, 14, 7, 7, 7, 7, 7, 7, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | > > | | < < | > > | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | > | < | > > > > > | > > | | | | | | | | | | | | | | | | | | | | | | | | | | < | > | | | | | | | | | | | > > > > > > | | > | | < > | | | | < > | | | | | | | | | | | | | | | | > | | < > > > | | | | | | | | | | < > | | | | | | | | | > | < | | | | > | | > | | | | < > | | | | | | | | < > > | | | | | | | > < | | | | < > | | | | | | | | | > > | | > | | | | > | > | | > | > | | | | | | | | | | > | | | | | | | | | | < > > > | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | > | | < | | | > > | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | > | | | | | < | < | | < | | | | 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 | 7, 7, 7, 7, 7, 7, 7, 5, 6, 7, 7, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 14, 14, 7, 7, 7, 7, 7, 7, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 23, 24, 175, 176, 177, 178, 179, 23, 24, 23, 24, 23, 24, 180, 181, 182, 183, 21, 23, 24, 21, 23, 24, 21, 21, 21, 21, 21, 94, 94, 184, 184, 23, 24, 23, 24, 21, 14, 14, 14, 14, 14, 14, 23, 24, 23, 24, 95, 95, 95, 23, 24, 0, 0, 0, 0, 0, 3, 3, 3, 3, 18, 3, 3, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 0, 185, 0, 0, 0, 0, 0, 185, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 94, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 0, 3, 3, 16, 20, 16, 20, 3, 3, 3, 16, 20, 3, 16, 20, 3, 3, 3, 3, 3, 3, 3, 3, 3, 8, 3, 3, 8, 3, 16, 20, 3, 3, 16, 20, 5, 6, 5, 6, 5, 6, 5, 6, 3, 3, 3, 3, 3, 94, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 8, 8, 3, 3, 3, 3, 8, 3, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 14, 14, 3, 3, 3, 5, 6, 5, 6, 5, 6, 5, 6, 8, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 2, 3, 3, 3, 14, 94, 15, 131, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 14, 14, 5, 6, 5, 6, 5, 6, 5, 6, 8, 5, 6, 6, 14, 131, 131, 131, 131, 131, 131, 131, 131, 131, 95, 95, 95, 95, 127, 127, 8, 94, 94, 94, 94, 94, 14, 14, 131, 131, 131, 94, 15, 3, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 95, 95, 11, 11, 94, 94, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 3, 94, 94, 94, 15, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 14, 14, 18, 18, 18, 18, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 18, 18, 18, 18, 18, 18, 18, 18, 14, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 94, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 94, 3, 3, 3, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 15, 95, 122, 122, 122, 3, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 3, 94, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 94, 94, 95, 95, 15, 15, 15, 15, 15, 15, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 95, 95, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 94, 94, 94, 94, 94, 94, 94, 94, 94, 11, 11, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 21, 21, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 94, 21, 21, 21, 21, 21, 21, 21, 21, 23, 24, 23, 24, 186, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 94, 11, 11, 23, 24, 187, 21, 15, 23, 24, 23, 24, 188, 21, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 189, 190, 191, 192, 189, 21, 193, 194, 195, 196, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 197, 198, 199, 23, 24, 23, 24, 200, 23, 24, 0, 0, 23, 24, 0, 21, 0, 21, 23, 24, 23, 24, 23, 24, 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 94, 94, 23, 24, 15, 94, 94, 21, 15, 15, 15, 15, 15, 15, 15, 95, 15, 15, 15, 95, 15, 15, 15, 15, 95, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 127, 127, 95, 95, 127, 14, 14, 14, 14, 95, 0, 0, 0, 18, 18, 18, 18, 18, 18, 14, 14, 4, 14, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 127, 127, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 95, 95, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 15, 15, 15, 15, 15, 15, 3, 3, 3, 15, 3, 15, 15, 95, 15, 15, 15, 15, 15, 15, 95, 95, 95, 95, 95, 95, 95, 95, 3, 3, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 127, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 95, 127, 127, 95, 95, 95, 95, 127, 127, 95, 95, 127, 127, 127, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 94, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 3, 3, 15, 15, 15, 15, 15, 95, 94, 15, 15, 15, 15, 15, 15, 15, 15, 15, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 95, 95, 95, 95, 95, 95, 127, 127, 95, 95, 127, 127, 95, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 95, 15, 15, 15, 15, 15, 15, 15, 15, 95, 127, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 3, 3, 3, 3, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 94, 15, 15, 15, 15, 15, 15, 14, 14, 14, 15, 127, 95, 127, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 95, 15, 95, 95, 95, 15, 15, 95, 95, 15, 15, 15, 15, 15, 95, 95, 15, 95, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 94, 3, 3, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 127, 95, 95, 127, 127, 3, 3, 15, 94, 94, 127, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 0, 0, 15, 15, 15, 15, 15, 15, 0, 0, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 0, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 202, 21, 21, 21, 21, 21, 21, 21, 11, 94, 94, 94, 94, 21, 21, 21, 21, 21, 21, 21, 21, 21, 94, 11, 11, 0, 0, 0, 0, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 15, 15, 15, 127, 127, 95, 127, 127, 95, 127, 127, 3, 127, 95, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 21, 21, 21, 21, 21, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 21, 21, 21, 0, 0, 0, 0, 0, 15, 95, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 7, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 0, 15, 0, 15, 15, 0, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 6, 5, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 4, 14, 14, 14, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 3, 3, 3, 3, 3, 3, 3, 5, 6, 3, 0, 0, 0, 0, 0, 0, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 3, 8, 8, 12, 12, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 3, 3, 5, 6, 3, 3, 3, 3, 12, 12, 12, 3, 3, 3, 0, 3, 3, 3, 3, 8, 5, 6, 5, 6, 5, 6, 3, 3, 3, 7, 8, 7, 7, 7, 0, 3, 4, 3, 3, 0, 0, 0, 0, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 17, 0, 3, 3, 3, 4, 3, 3, 3, 5, 6, 3, 7, 3, 8, 3, 3, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 3, 3, 7, 7, 7, 3, 11, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 5, 7, 6, 7, 5, 6, 3, 5, 6, 3, 3, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 94, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 94, 94, 0, 0, 15, 15, 15, 15, 15, 15, 0, 0, 15, 15, 15, 15, 15, 15, 0, 0, 15, 15, 15, 15, 15, 15, 0, 0, 15, 15, 15, 0, 0, 0, 4, 4, 7, 11, 14, 4, 4, 0, 14, 7, 7, 7, 7, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 14, 14, 0, 0 #if TCL_UTF_MAX > 3 || TCL_MAJOR_VERSION > 8 || TCL_MINOR_VERSION > 6 ,15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 3, 3, 3, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 18, 18, 18, 18, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 18, 18, 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 95, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 131, 15, 15, 15, 15, 15, 15, 15, 15, 131, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 95, 95, 95, 95, 95, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 3, 15, 15, 15, 15, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 3, 131, 131, 131, 131, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 0, 0, 0, 0, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 0, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 0, 208, 208, 208, 208, 208, 208, 208, 0, 208, 208, 0, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 0, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 0, 209, 209, 209, 209, 209, 209, 209, 0, 209, 209, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 94, 94, 94, 94, 94, 0, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 0, 94, 94, 94, 94, 94, 94, 94, 94, 94, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 0, 0, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 0, 0, 0, 15, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 3, 18, 18, 18, 18, 18, 18, 18, 18, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 18, 18, 18, 18, 18, 18, 0, 0, 0, 3, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 3, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 18, 18, 15, 15, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 15, 95, 95, 95, 0, 95, 95, 0, 0, 0, 0, 0, 95, 95, 95, 95, 15, 15, 15, 15, 0, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 95, 95, 95, 0, 0, 0, 0, 95, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 18, 18, 3, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 18, 18, 18, 15, 15, 15, 15, 15, 15, 15, 15, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 95, 95, 0, 0, 0, 0, 18, 18, 18, 18, 18, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 15, 15, 15, 15, 95, 95, 95, 95, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 15, 15, 15, 15, 94, 15, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 95, 95, 95, 95, 95, 8, 94, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 95, 95, 8, 0, 0, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 95, 95, 95, 18, 18, 18, 18, 18, 18, 18, 15, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 18, 18, 18, 18, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 95, 95, 95, 95, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 95, 127, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 95, 15, 15, 95, 95, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 127, 127, 127, 95, 95, 95, 95, 127, 127, 95, 95, 3, 3, 17, 3, 3, 3, 3, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 95, 95, 95, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 95, 95, 95, 95, 95, 127, 95, 95, 95, 95, 95, 95, 95, 95, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 3, 3, 3, 3, 15, 127, 127, 15, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 95, 3, 3, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 127, 127, 127, 95, 95, 95, 95, 95, 95, 95, 95, 95, 127, 127, 15, 15, 15, 15, 3, 3, 3, 3, 95, 95, 95, 95, 3, 127, 95, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 15, 3, 15, 3, 3, 3, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 127, 127, 127, 95, 95, 95, 127, 127, 95, 127, 95, 95, 3, 3, 3, 3, 3, 3, 95, 15, 15, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 0, 15, 0, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 3, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 95, 127, 127, 127, 95, 95, 95, 95, 95, 95, 95, 95, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 95, 95, 127, 127, 0, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 15, 15, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 0, 15, 15, 15, 15, 15, 0, 95, 95, 15, 127, 127, 95, 127, 127, 127, 127, 0, 0, 127, 127, 0, 0, 127, 127, 127, 0, 0, 15, 0, 0, 0, 0, 0, 0, 127, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 127, 127, 0, 0, 95, 95, 95, 95, 95, 95, 95, 0, 0, 0, 95, 95, 95, 95, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 0, 0, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 127, 127, 127, 95, 95, 95, 95, 95, 95, 0, 127, 0, 0, 127, 0, 127, 127, 127, 127, 0, 127, 127, 95, 127, 95, 15, 95, 15, 3, 3, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 95, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 127, 127, 127, 95, 95, 95, 95, 95, 95, 95, 95, 127, 127, 95, 95, 95, 127, 95, 15, 15, 15, 15, 3, 3, 3, 3, 3, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 3, 3, 0, 3, 95, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 127, 127, 127, 95, 95, 95, 95, 95, 95, 127, 95, 127, 127, 127, 127, 95, 95, 127, 95, 95, 15, 15, 3, 15, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 127, 127, 127, 95, 95, 95, 95, 0, 0, 127, 127, 127, 127, 95, 95, 127, 95, 95, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 15, 15, 15, 15, 95, 95, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 127, 127, 127, 95, 95, 95, 95, 95, 95, 95, 95, 127, 127, 95, 127, 95, 95, 3, 3, 3, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 95, 127, 95, 127, 127, 95, 95, 95, 95, 95, 95, 127, 95, 15, 3, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 95, 127, 95, 127, 127, 95, 95, 95, 95, 127, 95, 95, 95, 95, 95, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 18, 3, 3, 3, 14, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 127, 127, 127, 95, 95, 95, 95, 95, 95, 95, 95, 95, 127, 95, 95, 3, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 15, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 127, 127, 127, 127, 127, 127, 0, 127, 127, 0, 0, 95, 95, 127, 95, 15, 127, 15, 127, 95, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 127, 127, 127, 95, 95, 95, 95, 0, 0, 95, 95, 127, 127, 127, 127, 95, 15, 3, 15, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 95, 95, 95, 95, 95, 95, 127, 15, 95, 95, 95, 95, 3, 3, 3, 3, 3, 3, 3, 3, 95, 0, 0, 0, 0, 0, 0, 0, 0, 15, 95, 95, 95, 95, 95, 95, 127, 127, 95, 95, 95, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 127, 95, 95, 3, 3, 3, 15, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 127, 95, 95, 95, 95, 95, 95, 95, 0, 95, 95, 95, 95, 95, 95, 127, 95, 15, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 3, 3, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 0, 127, 95, 95, 95, 95, 95, 95, 95, 127, 95, 95, 127, 95, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 95, 95, 95, 95, 95, 95, 0, 0, 0, 95, 0, 95, 95, 0, 95, 95, 95, 95, 95, 95, 95, 15, 95, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 0, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 127, 127, 127, 127, 127, 0, 95, 95, 0, 127, 127, 95, 127, 95, 15, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 95, 95, 127, 127, 3, 3, 0, 0, 0, 0, 0, 0, 0, 95, 95, 15, 127, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 127, 127, 95, 95, 95, 95, 95, 0, 0, 0, 127, 127, 95, 127, 95, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 14, 14, 14, 14, 14, 14, 14, 14, 4, 4, 4, 4, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 0, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 95, 15, 15, 15, 15, 15, 15, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 127, 127, 127, 95, 95, 95, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 3, 3, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 95, 95, 95, 95, 95, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 95, 95, 95, 95, 95, 95, 95, 3, 3, 3, 3, 3, 14, 14, 14, 14, 94, 94, 94, 94, 3, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 18, 18, 18, 18, 18, 18, 18, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 94, 94, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 94, 94, 3, 3, 3, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 3, 3, 3, 3, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 95, 15, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 0, 0, 0, 0, 0, 0, 0, 95, 95, 95, 95, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 3, 94, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 94, 94, 94, 0, 94, 94, 94, 94, 94, 94, 94, 0, 94, 94, 0, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 14, 95, 95, 3, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 0, 0, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 127, 127, 95, 95, 95, 14, 14, 14, 127, 127, 127, 127, 127, 127, 17, 17, 17, 17, 17, 17, 17, 17, 95, 95, 95, 95, 95, 95, 95, 95, 14, 14, 95, 95, 95, 95, 95, 95, 95, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 95, 95, 95, 95, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 95, 95, 95, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 21, 21, 21, 21, 21, 21, 21, 0, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 110, 0, 110, 110, 0, 0, 110, 0, 0, 110, 110, 0, 0, 110, 110, 110, 110, 0, 110, 110, 110, 110, 110, 110, 110, 110, 21, 21, 21, 21, 0, 21, 0, 21, 21, 21, 21, 21, 21, 21, 0, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 110, 110, 0, 110, 110, 110, 110, 0, 0, 110, 110, 110, 110, 110, 110, 110, 110, 0, 110, 110, 110, 110, 110, 110, 110, 0, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 110, 110, 0, 110, 110, 110, 110, 0, 110, 110, 110, 110, 110, 0, 110, 0, 0, 0, 110, 110, 110, 110, 110, 110, 110, 0, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 110, 110, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 21, 21, 21, 21, 21, 21, 0, 0, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 7, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 7, 21, 21, 21, 21, 21, 21, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 7, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 7, 21, 21, 21, 21, 21, 21, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 7, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 7, 21, 21, 21, 21, 21, 21, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 7, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 7, 21, 21, 21, 21, 21, 21, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 7, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 7, 21, 21, 21, 21, 21, 21, 110, 21, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 14, 14, 14, 14, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 14, 14, 14, 14, 14, 14, 14, 14, 95, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 95, 14, 14, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 95, 95, 95, 95, 0, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 15, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 0, 0, 0, 0, 0, 0, 21, 21, 21, 21, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 95, 95, 95, 95, 95, 95, 0, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 0, 0, 95, 95, 95, 95, 95, 95, 95, 0, 95, 95, 0, 95, 95, 95, 95, 95, 0, 0, 0, 0, 0, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 95, 95, 95, 95, 95, 95, 95, 94, 94, 94, 94, 94, 94, 94, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 15, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 95, 95, 95, 95, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 4, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 94, 95, 95, 95, 95, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 95, 95, 15, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 3, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 0, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 95, 95, 95, 95, 95, 95, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 95, 95, 95, 95, 95, 95, 95, 94, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 14, 18, 18, 18, 4, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 14, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 0, 15, 0, 0, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 0, 15, 0, 15, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 15, 0, 15, 0, 15, 0, 15, 15, 15, 0, 15, 15, 0, 15, 0, 0, 15, 0, 15, 0, 15, 0, 15, 0, 15, 0, 15, 15, 0, 15, 0, 0, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 0, 15, 15, 15, 15, 0, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 15, 15, 15, 0, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15 #endif /* TCL_UTF_MAX > 3 */ }; /* * Each group represents a unique set of character attributes. The attributes * are encoded into a 32-bit value as follows: * |
︙ | ︙ | |||
1673 1674 1675 1676 1677 1678 1679 | * highest field so we can easily sign extend. */ static const int groups[] = { 0, 15, 12, 25, 27, 21, 22, 26, 20, 9, 8257, 28, 19, 8322, 29, 5, 23, 16, 11, -190078, 24, 2, -30846, 321, 386, -50879, 59522, -30911, 76930, -49790, 53825, 52801, 52545, 20289, 51777, 52033, | | | | | | | | | | | | | | | | | | | > | | | | 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 | * highest field so we can easily sign extend. */ static const int groups[] = { 0, 15, 12, 25, 27, 21, 22, 26, 20, 9, 8257, 28, 19, 8322, 29, 5, 23, 16, 11, -190078, 24, 2, -30846, 321, 386, -50879, 59522, -30911, 76930, -49790, 53825, 52801, 52545, 20289, 51777, 52033, 53057, -24702, 54081, 53569, -41598, -10895486, 54593, -33150, 54849, 55873, 55617, 56129, -14206, 609, 451, 674, 20354, -24767, -14271, -33215, 2763585, -41663, 2762817, -2768510, -49855, 17729, 18241, -2760318, -2759550, -2760062, 53890, 52866, 52610, 51842, 52098, -10833534, -10832510, 53122, -10839678, -10823550, -10830718, 53634, 54146, -2750078, -10829950, -2751614, 54658, 54914, -2745982, 55938, -10830462, -10824062, 17794, 55682, 18306, 56194, -10818686, -10817918, 4, 6, -21370, 29761, 9793, 9537, 16449, 16193, 9858, 9602, 8066, 16514, 16258, 2113, 16002, 14722, 1, 12162, 13954, 2178, 22146, 20610, -1662, 29826, -15295, 24706, -1727, 20545, 7, 3905, 3970, 12353, 12418, 8, 1859649, -769822, 9949249, 10, 1601154, 1600898, 1598594, 1598082, 1598338, 1596546, 1582466, -9027966, -769983, -9044862, -976254, -9058174, 15234, -1949375, -1918, -1983, -18814, -21886, -25470, -32638, -28542, -32126, -1981, -2174, -18879, -2237, 1844610, -21951, -25535, -28607, -32703, -32191, 13, 14, -1924287, -2145983, -2115007, 7233, 7298, 4170, 4234, 6749, 6813, -2750143, -976319, -2746047, 2763650, 2762882, -2759615, -2751679, -2760383, -2760127, -2768575, 1859714, -9044927, -10823615, -12158, -10830783, -10833599, -10832575, -10830015, -10817983, -10824127, -10818751, 237633, -12223, -10830527, -9058239, -10839743, -10895551, 237698, 9949314, 18, 17, 10305, 10370, 10049, 10114, 8769, 8834 }; #if TCL_UTF_MAX > 3 || TCL_MAJOR_VERSION > 8 || TCL_MINOR_VERSION > 6 # define UNICODE_OUT_OF_RANGE(ch) (((ch) & 0x1FFFFF) >= 0x323C0) #else # define UNICODE_OUT_OF_RANGE(ch) (((ch) & 0x1F0000) != 0) #endif |
︙ | ︙ |
Changes to generic/tclUtil.c.
︙ | ︙ | |||
3411 3412 3413 3414 3415 3416 3417 | * Callers should pass reasonable values for endValue - one in the * valid index range or TCL_INDEX_NONE (-1), for example for an empty * list. * * Results: * TCL_OK * | | | 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 | * Callers should pass reasonable values for endValue - one in the * valid index range or TCL_INDEX_NONE (-1), for example for an empty * list. * * Results: * TCL_OK * * The index is stored at the address given by 'indexPtr'. * * TCL_ERROR * * The value of 'objPtr' does not have one of the expected formats. If * 'interp' is non-NULL, an error message is left in the interpreter's * result object. * |
︙ | ︙ | |||
3696 3697 3698 3699 3700 3701 3702 | offset = irPtr->wideValue; if (offset == WIDE_MAX) { /* * Encodes end+1. This is distinguished from end+n as noted * in function header. * NOTE: this may wrap around if the caller passes (as lset does) | | | 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 | offset = irPtr->wideValue; if (offset == WIDE_MAX) { /* * Encodes end+1. This is distinguished from end+n as noted * in function header. * NOTE: this may wrap around if the caller passes (as lset does) * listLen-1 as endValue and listLen is 0. The -1 will be * interpreted as FF...FF and adding 1 will result in 0 which * is what we want. Callers like lset which pass in listLen-1 == -1 * as endValue will have to adjust accordingly. */ *widePtr = (endValue == -1) ? WIDE_MAX : endValue + 1; } else if (offset == WIDE_MIN) { *widePtr = (endValue == -1) ? WIDE_MIN : -1; |
︙ | ︙ |
Changes to generic/tclVar.c.
︙ | ︙ | |||
208 209 210 211 212 213 214 | Interp *iPtr, Tcl_Obj *part1Ptr, Tcl_Obj *part2Ptr, int flags, int index); /* * TIP #508: [array default] */ | | | 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 | Interp *iPtr, Tcl_Obj *part1Ptr, Tcl_Obj *part2Ptr, int flags, int index); /* * TIP #508: [array default] */ static Tcl_ObjCmdProc ArrayDefaultCmd; static void DeleteArrayVar(Var *arrayPtr); static void SetArrayDefault(Var *arrayPtr, Tcl_Obj *defaultObj); /* * Functions defined in this file that may be exported in the future for use * by the bytecode compiler and engine or to the public interface. */ |
︙ | ︙ | |||
248 249 250 251 252 253 254 | static const Tcl_ObjType localVarNameType = { "localVarName", FreeLocalVarName, DupLocalVarName, NULL, NULL, TCL_OBJTYPE_V0 }; | | | | | | | | | | | | | | | 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 | static const Tcl_ObjType localVarNameType = { "localVarName", FreeLocalVarName, DupLocalVarName, NULL, NULL, TCL_OBJTYPE_V0 }; #define LocalSetInternalRep(objPtr, index, namePtr) \ do { \ Tcl_ObjInternalRep ir; \ Tcl_Obj *ptr = (namePtr); \ if (ptr) {Tcl_IncrRefCount(ptr);} \ ir.twoPtrValue.ptr1 = ptr; \ ir.twoPtrValue.ptr2 = INT2PTR(index); \ Tcl_StoreInternalRep((objPtr), &localVarNameType, &ir); \ } while (0) #define LocalGetInternalRep(objPtr, index, name) \ do { \ const Tcl_ObjInternalRep *irPtr; \ irPtr = TclFetchInternalRep((objPtr), &localVarNameType); \ (name) = irPtr ? (Tcl_Obj *)irPtr->twoPtrValue.ptr1 : NULL; \ (index) = irPtr ? PTR2INT(irPtr->twoPtrValue.ptr2) : TCL_INDEX_NONE; \ } while (0) static const Tcl_ObjType parsedVarNameType = { "parsedVarName", FreeParsedVarName, DupParsedVarName, NULL, NULL, TCL_OBJTYPE_V0 }; #define ParsedSetInternalRep(objPtr, arrayPtr, elem) \ do { \ Tcl_ObjInternalRep ir; \ Tcl_Obj *ptr1 = (arrayPtr); \ Tcl_Obj *ptr2 = (elem); \ if (ptr1) {Tcl_IncrRefCount(ptr1);} \ if (ptr2) {Tcl_IncrRefCount(ptr2);} \ ir.twoPtrValue.ptr1 = ptr1; \ ir.twoPtrValue.ptr2 = ptr2; \ Tcl_StoreInternalRep((objPtr), &parsedVarNameType, &ir); \ } while (0) #define ParsedGetInternalRep(objPtr, parsed, array, elem) \ do { \ const Tcl_ObjInternalRep *irPtr; \ irPtr = TclFetchInternalRep((objPtr), &parsedVarNameType); \ (parsed) = (irPtr != NULL); \ (array) = irPtr ? (Tcl_Obj *)irPtr->twoPtrValue.ptr1 : NULL; \ (elem) = irPtr ? (Tcl_Obj *)irPtr->twoPtrValue.ptr2 : NULL; \ } while (0) Var * TclVarHashCreateVar( TclVarHashTable *tablePtr, const char *key, int *newPtr) |
︙ | ︙ | |||
527 528 529 530 531 532 533 | * *---------------------------------------------------------------------- */ Var * TclObjLookupVar( Tcl_Interp *interp, /* Interpreter to use for lookup. */ | | | | | 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 | * *---------------------------------------------------------------------- */ Var * TclObjLookupVar( Tcl_Interp *interp, /* Interpreter to use for lookup. */ Tcl_Obj *part1Ptr, /* If part2 isn't NULL, this is the name of an * array. Otherwise, this is a full variable * name that could include a parenthesized * array element. */ const char *part2, /* Name of element within array, or NULL. */ int flags, /* Only TCL_GLOBAL_ONLY, TCL_NAMESPACE_ONLY, * and TCL_LEAVE_ERR_MSG bits matter. */ const char *msg, /* Verb to use in error messages, e.g. "read" * or "set". Only needed if TCL_LEAVE_ERR_MSG * is set in flags. */ int createPart1, /* If 1, create hash table entry for part 1 of * name, if it doesn't already exist. If 0, * return error if it doesn't exist. */ int createPart2, /* If 1, create hash table entry for part 2 of * name, if it doesn't already exist. If 0, * return error if it doesn't exist. */ Var **arrayPtrPtr) /* If the name refers to an element of an * array, *arrayPtrPtr gets filled in with * address of array variable. Otherwise this * is set to NULL. */ { |
︙ | ︙ | |||
587 588 589 590 591 592 593 | * parenthesized array element. */ Tcl_Obj *part2Ptr, /* Name of element within array, or NULL. */ int flags, /* Only TCL_GLOBAL_ONLY, TCL_NAMESPACE_ONLY, * and TCL_LEAVE_ERR_MSG bits matter. */ const char *msg, /* Verb to use in error messages, e.g. "read" * or "set". Only needed if TCL_LEAVE_ERR_MSG * is set in flags. */ | | | | 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 | * parenthesized array element. */ Tcl_Obj *part2Ptr, /* Name of element within array, or NULL. */ int flags, /* Only TCL_GLOBAL_ONLY, TCL_NAMESPACE_ONLY, * and TCL_LEAVE_ERR_MSG bits matter. */ const char *msg, /* Verb to use in error messages, e.g. "read" * or "set". Only needed if TCL_LEAVE_ERR_MSG * is set in flags. */ int createPart1, /* If 1, create hash table entry for part 1 of * name, if it doesn't already exist. If 0, * return error if it doesn't exist. */ int createPart2, /* If 1, create hash table entry for part 2 of * name, if it doesn't already exist. If 0, * return error if it doesn't exist. */ Var **arrayPtrPtr) /* If the name refers to an element of an * array, *arrayPtrPtr gets filled in with * address of array variable. Otherwise this * is set to NULL. */ { |
︙ | ︙ | |||
741 742 743 744 745 746 747 | */ LocalSetInternalRep(part1Ptr, index, cachedNamePtr); /* Then wipe it */ TclFreeInternalRep(cachedNamePtr); /* | | | 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 | */ LocalSetInternalRep(part1Ptr, index, cachedNamePtr); /* Then wipe it */ TclFreeInternalRep(cachedNamePtr); /* * Now go ahead and convert it to the "localVarName" type, * since we suspect at least some use of the value as a * varname and we want to resolve it quickly. */ LocalSetInternalRep(cachedNamePtr, index, NULL); } } else { /* |
︙ | ︙ | |||
823 824 825 826 827 828 829 | TclLookupSimpleVar( Tcl_Interp *interp, /* Interpreter to use for lookup. */ Tcl_Obj *varNamePtr, /* This is a simple variable name that could * represent a scalar or an array. */ int flags, /* Only TCL_GLOBAL_ONLY, TCL_NAMESPACE_ONLY, * TCL_AVOID_RESOLVERS and TCL_LEAVE_ERR_MSG * bits matter. */ | | | 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 | TclLookupSimpleVar( Tcl_Interp *interp, /* Interpreter to use for lookup. */ Tcl_Obj *varNamePtr, /* This is a simple variable name that could * represent a scalar or an array. */ int flags, /* Only TCL_GLOBAL_ONLY, TCL_NAMESPACE_ONLY, * TCL_AVOID_RESOLVERS and TCL_LEAVE_ERR_MSG * bits matter. */ int create, /* If 1, create hash table entry for varname, * if it doesn't already exist. If 0, return * error if it doesn't exist. */ const char **errMsgPtr, int *indexPtr) { Interp *iPtr = (Interp *) interp; CallFrame *varFramePtr = iPtr->varFramePtr; |
︙ | ︙ | |||
1056 1057 1058 1059 1060 1061 1062 | Var * TclLookupArrayElement( Tcl_Interp *interp, /* Interpreter to use for lookup. */ Tcl_Obj *arrayNamePtr, /* This is the name of the array, or NULL if * index>= 0. */ Tcl_Obj *elNamePtr, /* Name of element within array. */ | | | | | 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 | Var * TclLookupArrayElement( Tcl_Interp *interp, /* Interpreter to use for lookup. */ Tcl_Obj *arrayNamePtr, /* This is the name of the array, or NULL if * index>= 0. */ Tcl_Obj *elNamePtr, /* Name of element within array. */ int flags, /* Only TCL_LEAVE_ERR_MSG bit matters. */ const char *msg, /* Verb to use in error messages, e.g. "read" * or "set". Only needed if TCL_LEAVE_ERR_MSG * is set in flags. */ int createArray, /* If 1, transform arrayName to be an array if * it isn't one yet and the transformation is * possible. If 0, return error if it isn't * already an array. */ int createElem, /* If 1, create hash table entry for the * element, if it doesn't already exist. If 0, * return error if it doesn't exist. */ Var *arrayPtr, /* Pointer to the array's Var structure. */ int index) /* If >=0, the index of the local array. */ { int isNew; Var *varPtr; |
︙ | ︙ | |||
1273 1274 1275 1276 1277 1278 1279 | *---------------------------------------------------------------------- */ Tcl_Obj * Tcl_ObjGetVar2( Tcl_Interp *interp, /* Command interpreter in which variable is to * be looked up. */ | | | | 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 | *---------------------------------------------------------------------- */ Tcl_Obj * Tcl_ObjGetVar2( Tcl_Interp *interp, /* Command interpreter in which variable is to * be looked up. */ Tcl_Obj *part1Ptr, /* Points to an object holding the name of an * array (if part2 is non-NULL) or the name of * a variable. */ Tcl_Obj *part2Ptr, /* If non-null, points to an object holding * the name of an element in the array * part1Ptr. */ int flags) /* OR-ed combination of TCL_GLOBAL_ONLY and * TCL_LEAVE_ERR_MSG bits. */ { Var *varPtr, *arrayPtr; |
︙ | ︙ | |||
1332 1333 1334 1335 1336 1337 1338 | Tcl_Var varPtr, /* The variable to be read.*/ Tcl_Var arrayPtr, /* NULL for scalar variables, pointer to the * containing array otherwise. */ Tcl_Obj *part1Ptr, /* Name of an array (if part2 is non-NULL) or * the name of a variable. */ Tcl_Obj *part2Ptr, /* If non-NULL, gives the name of an element * in the array part1. */ | | | 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 | Tcl_Var varPtr, /* The variable to be read.*/ Tcl_Var arrayPtr, /* NULL for scalar variables, pointer to the * containing array otherwise. */ Tcl_Obj *part1Ptr, /* Name of an array (if part2 is non-NULL) or * the name of a variable. */ Tcl_Obj *part2Ptr, /* If non-NULL, gives the name of an element * in the array part1. */ int flags) /* OR-ed combination of TCL_GLOBAL_ONLY, and * TCL_LEAVE_ERR_MSG bits. */ { if (varPtr == NULL) { Tcl_Panic("varPtr must not be NULL"); } if (part1Ptr == NULL) { Tcl_Panic("part1Ptr must not be NULL"); |
︙ | ︙ | |||
1371 1372 1373 1374 1375 1376 1377 | *---------------------------------------------------------------------- */ Tcl_Obj * TclPtrGetVarIdx( Tcl_Interp *interp, /* Command interpreter in which variable is to * be looked up. */ | | | | 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 | *---------------------------------------------------------------------- */ Tcl_Obj * TclPtrGetVarIdx( Tcl_Interp *interp, /* Command interpreter in which variable is to * be looked up. */ Var *varPtr, /* The variable to be read.*/ Var *arrayPtr, /* NULL for scalar variables, pointer to the * containing array otherwise. */ Tcl_Obj *part1Ptr, /* Name of an array (if part2 is non-NULL) or * the name of a variable. */ Tcl_Obj *part2Ptr, /* If non-NULL, gives the name of an element * in the array part1. */ int flags, /* OR-ed combination of TCL_GLOBAL_ONLY, and * TCL_LEAVE_ERR_MSG bits. */ int index) /* Index into the local variable table of the * variable, or -1. Only used when part1Ptr is * NULL. */ { Interp *iPtr = (Interp *) interp; const char *msg; |
︙ | ︙ | |||
1479 1480 1481 1482 1483 1484 1485 | * *---------------------------------------------------------------------- */ int Tcl_SetObjCmd( TCL_UNUSED(void *), | | | 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 | * *---------------------------------------------------------------------- */ int Tcl_SetObjCmd( TCL_UNUSED(void *), Tcl_Interp *interp, /* Current interpreter. */ int objc, /* Number of arguments. */ Tcl_Obj *const objv[]) /* Argument objects. */ { Tcl_Obj *varValueObj; if (objc == 2) { varValueObj = Tcl_ObjGetVar2(interp, objv[1], NULL,TCL_LEAVE_ERR_MSG); |
︙ | ︙ | |||
1656 1657 1658 1659 1660 1661 1662 | *---------------------------------------------------------------------- */ Tcl_Obj * Tcl_ObjSetVar2( Tcl_Interp *interp, /* Command interpreter in which variable is to * be found. */ | | | | 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 | *---------------------------------------------------------------------- */ Tcl_Obj * Tcl_ObjSetVar2( Tcl_Interp *interp, /* Command interpreter in which variable is to * be found. */ Tcl_Obj *part1Ptr, /* Points to an object holding the name of an * array (if part2 is non-NULL) or the name of * a variable. */ Tcl_Obj *part2Ptr, /* If non-NULL, points to an object holding * the name of an element in the array * part1Ptr. */ Tcl_Obj *newValuePtr, /* New value for variable. */ int flags) /* Various flags that tell how to set value: * any of TCL_GLOBAL_ONLY, TCL_NAMESPACE_ONLY, * TCL_APPEND_VALUE, TCL_LIST_ELEMENT, or * TCL_LEAVE_ERR_MSG. */ |
︙ | ︙ | |||
1727 1728 1729 1730 1731 1732 1733 | * variable, or NULL if the variable is a * scalar. */ Tcl_Obj *part1Ptr, /* Name of an array (if part2 is non-NULL) or * the name of a variable. */ Tcl_Obj *part2Ptr, /* If non-NULL, gives the name of an element * in the array part1. */ Tcl_Obj *newValuePtr, /* New value for variable. */ | | | 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 | * variable, or NULL if the variable is a * scalar. */ Tcl_Obj *part1Ptr, /* Name of an array (if part2 is non-NULL) or * the name of a variable. */ Tcl_Obj *part2Ptr, /* If non-NULL, gives the name of an element * in the array part1. */ Tcl_Obj *newValuePtr, /* New value for variable. */ int flags) /* OR-ed combination of TCL_GLOBAL_ONLY, and * TCL_LEAVE_ERR_MSG bits. */ { if (varPtr == NULL) { Tcl_Panic("varPtr must not be NULL"); } if (part1Ptr == NULL) { Tcl_Panic("part1Ptr must not be NULL"); |
︙ | ︙ | |||
1896 1897 1898 1899 1900 1901 1902 | *---------------------------------------------------------------------- */ Tcl_Obj * TclPtrSetVarIdx( Tcl_Interp *interp, /* Command interpreter in which variable is to * be looked up. */ | | | | 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 | *---------------------------------------------------------------------- */ Tcl_Obj * TclPtrSetVarIdx( Tcl_Interp *interp, /* Command interpreter in which variable is to * be looked up. */ Var *varPtr, /* Reference to the variable to set. */ Var *arrayPtr, /* Reference to the array containing the * variable, or NULL if the variable is a * scalar. */ Tcl_Obj *part1Ptr, /* Name of an array (if part2 is non-NULL) or * the name of a variable. NULL if the 'index' * parameter is >= 0 */ Tcl_Obj *part2Ptr, /* If non-NULL, gives the name of an element * in the array part1. */ Tcl_Obj *newValuePtr, /* New value for variable. */ int flags, /* OR-ed combination of TCL_GLOBAL_ONLY, and * TCL_LEAVE_ERR_MSG bits. */ int index) /* Index of local var where part1 is to be * found. */ { Interp *iPtr = (Interp *) interp; Tcl_Obj *oldValuePtr; Tcl_Obj *resultPtr = NULL; |
︙ | ︙ | |||
2165 2166 2167 2168 2169 2170 2171 | * array (if part2 is non-NULL) or the name of * a variable. */ Tcl_Obj *part2Ptr, /* If non-null, points to an object holding * the name of an element in the array * part1Ptr. */ Tcl_Obj *incrPtr, /* Increment value. */ /* TODO: Which of these flag values really make sense? */ | | | 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 | * array (if part2 is non-NULL) or the name of * a variable. */ Tcl_Obj *part2Ptr, /* If non-null, points to an object holding * the name of an element in the array * part1Ptr. */ Tcl_Obj *incrPtr, /* Increment value. */ /* TODO: Which of these flag values really make sense? */ int flags) /* Various flags that tell how to incr value: * any of TCL_GLOBAL_ONLY, TCL_NAMESPACE_ONLY, * TCL_APPEND_VALUE, TCL_LIST_ELEMENT, * TCL_LEAVE_ERR_MSG. */ { if (varPtr == NULL) { Tcl_Panic("varPtr must not be NULL"); } |
︙ | ︙ | |||
2221 2222 2223 2224 2225 2226 2227 | * array (if part2 is non-NULL) or the name of * a variable. */ Tcl_Obj *part2Ptr, /* If non-null, points to an object holding * the name of an element in the array * part1Ptr. */ Tcl_Obj *incrPtr, /* Increment value. */ /* TODO: Which of these flag values really make sense? */ | | | 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 | * array (if part2 is non-NULL) or the name of * a variable. */ Tcl_Obj *part2Ptr, /* If non-null, points to an object holding * the name of an element in the array * part1Ptr. */ Tcl_Obj *incrPtr, /* Increment value. */ /* TODO: Which of these flag values really make sense? */ int flags, /* Various flags that tell how to incr value: * any of TCL_GLOBAL_ONLY, TCL_NAMESPACE_ONLY, * TCL_APPEND_VALUE, TCL_LIST_ELEMENT, * TCL_LEAVE_ERR_MSG. */ int index) /* Index into the local variable table of the * variable, or -1. Only used when part1Ptr is * NULL. */ { |
︙ | ︙ | |||
2410 2411 2412 2413 2414 2415 2416 | Tcl_Var varPtr, /* The variable to be unset. */ Tcl_Var arrayPtr, /* NULL for scalar variables, pointer to the * containing array otherwise. */ Tcl_Obj *part1Ptr, /* Name of an array (if part2 is non-NULL) or * the name of a variable. */ Tcl_Obj *part2Ptr, /* If non-NULL, gives the name of an element * in the array part1. */ | | | 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 | Tcl_Var varPtr, /* The variable to be unset. */ Tcl_Var arrayPtr, /* NULL for scalar variables, pointer to the * containing array otherwise. */ Tcl_Obj *part1Ptr, /* Name of an array (if part2 is non-NULL) or * the name of a variable. */ Tcl_Obj *part2Ptr, /* If non-NULL, gives the name of an element * in the array part1. */ int flags) /* OR-ed combination of any of * TCL_GLOBAL_ONLY, TCL_NAMESPACE_ONLY, * TCL_LEAVE_ERR_MSG. */ { if (varPtr == NULL) { Tcl_Panic("varPtr must not be NULL"); } if (part1Ptr == NULL) { |
︙ | ︙ | |||
2986 2987 2988 2989 2990 2991 2992 | /* *---------------------------------------------------------------------- * * ArrayForObjCmd, ArrayForNRCmd, ArrayForLoopCallback, ArrayObjNext -- * * These functions implement the "array for" Tcl command. * array for {k v} a {} | | | 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 | /* *---------------------------------------------------------------------- * * ArrayForObjCmd, ArrayForNRCmd, ArrayForLoopCallback, ArrayObjNext -- * * These functions implement the "array for" Tcl command. * array for {k v} a {} * The array for command iterates over the array, setting the * specified loop variables, and executing the body each iteration. * * ArrayForObjCmd() is the standard wrapper around ArrayForNRCmd(). * * ArrayForNRCmd() sets up the ArraySearch structure, sets arrayNamePtr * inside the structure and calls VarHashFirstEntry to start the hash * iteration. |
︙ | ︙ | |||
4476 4477 4478 4479 4480 4481 4482 | ObjMakeUpvar( Tcl_Interp *interp, /* Interpreter containing variables. Used for * error messages, too. */ CallFrame *framePtr, /* Call frame containing "other" variable. * NULL means use global :: context. */ Tcl_Obj *otherP1Ptr, const char *otherP2, /* Two-part name of variable in framePtr. */ | | | 4476 4477 4478 4479 4480 4481 4482 4483 4484 4485 4486 4487 4488 4489 4490 | ObjMakeUpvar( Tcl_Interp *interp, /* Interpreter containing variables. Used for * error messages, too. */ CallFrame *framePtr, /* Call frame containing "other" variable. * NULL means use global :: context. */ Tcl_Obj *otherP1Ptr, const char *otherP2, /* Two-part name of variable in framePtr. */ int otherFlags, /* 0, TCL_GLOBAL_ONLY or TCL_NAMESPACE_ONLY: * indicates scope of "other" variable. */ Tcl_Obj *myNamePtr, /* Name of variable which will refer to * otherP1/otherP2. Must be a scalar. */ int myFlags, /* 0, TCL_GLOBAL_ONLY or TCL_NAMESPACE_ONLY: * indicates scope of myName. */ int index) /* If the variable to be linked is an indexed * scalar, this is its index. Otherwise, -1 */ |
︙ | ︙ | |||
5333 5334 5335 5336 5337 5338 5339 | * *---------------------------------------------------------------------- */ static void DeleteSearches( Interp *iPtr, | | | 5333 5334 5335 5336 5337 5338 5339 5340 5341 5342 5343 5344 5345 5346 5347 | * *---------------------------------------------------------------------- */ static void DeleteSearches( Interp *iPtr, Var *arrayVarPtr) /* Variable whose searches are to be * deleted. */ { ArraySearch *searchPtr, *nextPtr; Tcl_HashEntry *sPtr; if (arrayVarPtr->flags & VAR_SEARCH_ACTIVE) { sPtr = Tcl_FindHashEntry(&iPtr->varSearches, arrayVarPtr); |
︙ | ︙ | |||
5994 5995 5996 5997 5998 5999 6000 | Tcl_Obj *const objv[]) /* Argument objects. */ { Interp *iPtr = (Interp *) interp; const char *varName, *pattern, *simplePattern; Tcl_HashSearch search; Var *varPtr; Namespace *nsPtr; | < | 5994 5995 5996 5997 5998 5999 6000 6001 6002 6003 6004 6005 6006 6007 | Tcl_Obj *const objv[]) /* Argument objects. */ { Interp *iPtr = (Interp *) interp; const char *varName, *pattern, *simplePattern; Tcl_HashSearch search; Var *varPtr; Namespace *nsPtr; Namespace *currNsPtr = (Namespace *) Tcl_GetCurrentNamespace(interp); Tcl_Obj *listPtr, *elemObjPtr, *varNamePtr; int specificNsInPattern = 0;/* Init. to avoid compiler warning. */ Tcl_Obj *simplePatternPtr = NULL; /* * Get the pattern and find the "effective namespace" in which to list |
︙ | ︙ | |||
6075 6076 6077 6078 6079 6080 6081 | Tcl_GetVariableFullName(interp, (Tcl_Var) varPtr, elemObjPtr); } else { elemObjPtr = VarHashGetKey(varPtr); } Tcl_ListObjAppendElement(interp, listPtr, elemObjPtr); } | < < < < < < < < < < | 6074 6075 6076 6077 6078 6079 6080 6081 6082 6083 6084 6085 6086 6087 | Tcl_GetVariableFullName(interp, (Tcl_Var) varPtr, elemObjPtr); } else { elemObjPtr = VarHashGetKey(varPtr); } Tcl_ListObjAppendElement(interp, listPtr, elemObjPtr); } } } else { /* * Have to scan the tables of variables. */ varPtr = VarHashFirstVar(&nsPtr->varTable, &search); |
︙ | ︙ | |||
6110 6111 6112 6113 6114 6115 6116 | } else { elemObjPtr = varNamePtr; } Tcl_ListObjAppendElement(interp, listPtr, elemObjPtr); } } varPtr = VarHashNextVar(&search); | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 6099 6100 6101 6102 6103 6104 6105 6106 6107 6108 6109 6110 6111 6112 | } else { elemObjPtr = varNamePtr; } Tcl_ListObjAppendElement(interp, listPtr, elemObjPtr); } } varPtr = VarHashNextVar(&search); } } } else if (iPtr->varFramePtr->procPtr != NULL) { AppendLocals(interp, listPtr, simplePatternPtr, 1, 0); } if (simplePatternPtr) { |
︙ | ︙ | |||
6802 6803 6804 6805 6806 6807 6808 | VarHashRefCount(varPtr)--; } Tcl_DecrRefCount(objPtr); } static int CompareVarKeys( | | | 6762 6763 6764 6765 6766 6767 6768 6769 6770 6771 6772 6773 6774 6775 6776 | VarHashRefCount(varPtr)--; } Tcl_DecrRefCount(objPtr); } static int CompareVarKeys( void *keyPtr, /* New key to compare. */ Tcl_HashEntry *hPtr) /* Existing key to compare. */ { Tcl_Obj *objPtr1 = (Tcl_Obj *)keyPtr; Tcl_Obj *objPtr2 = hPtr->key.objPtr; const char *p1, *p2; size_t l1, l2; |
︙ | ︙ |
Changes to generic/tclZipfs.c.
︙ | ︙ | |||
113 114 115 116 117 118 119 120 121 122 123 124 125 126 | #define ZIP_LOCAL_MDATE_OFFS 12 #define ZIP_LOCAL_CRC32_OFFS 14 #define ZIP_LOCAL_COMPLEN_OFFS 18 #define ZIP_LOCAL_UNCOMPLEN_OFFS 22 #define ZIP_LOCAL_PATHLEN_OFFS 26 #define ZIP_LOCAL_EXTRALEN_OFFS 28 /* * Central header of ZIP archive member at end of ZIP file. */ #define ZIP_CENTRAL_HEADER_SIG 0x02014b50 #define ZIP_CENTRAL_HEADER_LEN 46 #define ZIP_CENTRAL_SIG_OFFS 0 | > > | 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | #define ZIP_LOCAL_MDATE_OFFS 12 #define ZIP_LOCAL_CRC32_OFFS 14 #define ZIP_LOCAL_COMPLEN_OFFS 18 #define ZIP_LOCAL_UNCOMPLEN_OFFS 22 #define ZIP_LOCAL_PATHLEN_OFFS 26 #define ZIP_LOCAL_EXTRALEN_OFFS 28 #define ZIP_LOCAL_FLAGS_UTF8 0x0800 /* * Central header of ZIP archive member at end of ZIP file. */ #define ZIP_CENTRAL_HEADER_SIG 0x02014b50 #define ZIP_CENTRAL_HEADER_LEN 46 #define ZIP_CENTRAL_SIG_OFFS 0 |
︙ | ︙ | |||
2624 2625 2626 2627 2628 2629 2630 | } /* *------------------------------------------------------------------------- * * ZipFSMountBufferObjCmd -- * | | | 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 | } /* *------------------------------------------------------------------------- * * ZipFSMountBufferObjCmd -- * * This procedure is invoked to process the [zipfs mountdata] command. * * Results: * A standard Tcl result. * * Side effects: * A ZIP archive file is mounted, resources are allocated. * |
︙ | ︙ | |||
3729 3730 3731 3732 3733 3734 3735 | unsigned char *buf, /* Where to serialize to */ ZipEntry *z, /* The description of what to serialize. */ int nameLength, /* The length of the name. */ int align) /* The number of alignment bytes. */ { ZipWriteInt(start, end, buf + ZIP_LOCAL_SIG_OFFS, ZIP_LOCAL_HEADER_SIG); ZipWriteShort(start, end, buf + ZIP_LOCAL_VERSION_OFFS, ZIP_MIN_VERSION); | | | 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 | unsigned char *buf, /* Where to serialize to */ ZipEntry *z, /* The description of what to serialize. */ int nameLength, /* The length of the name. */ int align) /* The number of alignment bytes. */ { ZipWriteInt(start, end, buf + ZIP_LOCAL_SIG_OFFS, ZIP_LOCAL_HEADER_SIG); ZipWriteShort(start, end, buf + ZIP_LOCAL_VERSION_OFFS, ZIP_MIN_VERSION); ZipWriteShort(start, end, buf + ZIP_LOCAL_FLAGS_OFFS, z->isEncrypted + ZIP_LOCAL_FLAGS_UTF8); ZipWriteShort(start, end, buf + ZIP_LOCAL_COMPMETH_OFFS, z->compressMethod); ZipWriteShort(start, end, buf + ZIP_LOCAL_MTIME_OFFS, ToDosTime(z->timestamp)); ZipWriteShort(start, end, buf + ZIP_LOCAL_MDATE_OFFS, ToDosDate(z->timestamp)); ZipWriteInt(start, end, buf + ZIP_LOCAL_CRC32_OFFS, z->crc32); |
︙ | ︙ | |||
3757 3758 3759 3760 3761 3762 3763 | size_t nameLength) /* The length of the name. */ { ZipWriteInt(start, end, buf + ZIP_CENTRAL_SIG_OFFS, ZIP_CENTRAL_HEADER_SIG); ZipWriteShort(start, end, buf + ZIP_CENTRAL_VERSIONMADE_OFFS, ZIP_MIN_VERSION); ZipWriteShort(start, end, buf + ZIP_CENTRAL_VERSION_OFFS, ZIP_MIN_VERSION); | | | 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 | size_t nameLength) /* The length of the name. */ { ZipWriteInt(start, end, buf + ZIP_CENTRAL_SIG_OFFS, ZIP_CENTRAL_HEADER_SIG); ZipWriteShort(start, end, buf + ZIP_CENTRAL_VERSIONMADE_OFFS, ZIP_MIN_VERSION); ZipWriteShort(start, end, buf + ZIP_CENTRAL_VERSION_OFFS, ZIP_MIN_VERSION); ZipWriteShort(start, end, buf + ZIP_CENTRAL_FLAGS_OFFS, z->isEncrypted + ZIP_LOCAL_FLAGS_UTF8); ZipWriteShort(start, end, buf + ZIP_CENTRAL_COMPMETH_OFFS, z->compressMethod); ZipWriteShort(start, end, buf + ZIP_CENTRAL_MTIME_OFFS, ToDosTime(z->timestamp)); ZipWriteShort(start, end, buf + ZIP_CENTRAL_MDATE_OFFS, ToDosDate(z->timestamp)); ZipWriteInt(start, end, buf + ZIP_CENTRAL_CRC32_OFFS, z->crc32); |
︙ | ︙ | |||
4236 4237 4238 4239 4240 4241 4242 4243 4244 4245 4246 4247 4248 4249 | TclNewObj(searchPathObj); Tcl_ListObjAppendElement(NULL, searchPathObj, Tcl_FSJoinToPath(libDirObj, 1, &subDirObj)); Tcl_DecrRefCount(subDirObj); Tcl_IncrRefCount(searchPathObj); Tcl_SetEncodingSearchPath(searchPathObj); Tcl_DecrRefCount(searchPathObj); return libDirObj; } Tcl_Obj * TclZipfs_TclLibrary(void) { Tcl_Obj *vfsInitScript; | > > | 4238 4239 4240 4241 4242 4243 4244 4245 4246 4247 4248 4249 4250 4251 4252 4253 | TclNewObj(searchPathObj); Tcl_ListObjAppendElement(NULL, searchPathObj, Tcl_FSJoinToPath(libDirObj, 1, &subDirObj)); Tcl_DecrRefCount(subDirObj); Tcl_IncrRefCount(searchPathObj); Tcl_SetEncodingSearchPath(searchPathObj); Tcl_DecrRefCount(searchPathObj); /* Bug [fccb9f322f]. Reinit system encoding after setting search path */ TclpSetInitialEncodings(); return libDirObj; } Tcl_Obj * TclZipfs_TclLibrary(void) { Tcl_Obj *vfsInitScript; |
︙ | ︙ | |||
5829 5830 5831 5832 5833 5834 5835 5836 | static int ZipFSPathInFilesystemProc( Tcl_Obj *pathPtr, TCL_UNUSED(void **)) { Tcl_Size len; char *path; | > > > > > > > > > > > > > > > > > > | | | > > > > | > > > > > > | 5833 5834 5835 5836 5837 5838 5839 5840 5841 5842 5843 5844 5845 5846 5847 5848 5849 5850 5851 5852 5853 5854 5855 5856 5857 5858 5859 5860 5861 5862 5863 5864 5865 5866 5867 5868 5869 5870 5871 5872 5873 5874 5875 5876 5877 5878 5879 5880 5881 5882 5883 5884 5885 5886 5887 | static int ZipFSPathInFilesystemProc( Tcl_Obj *pathPtr, TCL_UNUSED(void **)) { Tcl_Size len; char *path; int ret, decrRef = 0; if (TclFSCwdIsNative() || Tcl_FSGetPathType(pathPtr) == TCL_PATH_ABSOLUTE) { /* * The cwd is native (or path is absolute), use the translated path * without worrying about normalization (this will also usually be * shorter so the utf-to-external conversion will be somewhat faster). */ pathPtr = Tcl_FSGetTranslatedPath(NULL, pathPtr); if (pathPtr == NULL) { return -1; } decrRef = 1; /* Tcl_FSGetTranslatedPath increases refCount */ } else { /* * Make sure the normalized path is set. */ pathPtr = Tcl_FSGetNormalizedPath(NULL, pathPtr); if (!pathPtr) { return -1; } /* Tcl_FSGetNormalizedPath doesn't increase refCount */ } path = TclGetStringFromObj(pathPtr, &len); /* * Claim any path under ZIPFS_VOLUME as ours. This is both a necessary * and sufficient condition as zipfs mounts at arbitrary paths are * not permitted (unlike Androwish). */ ret = ( (len < ZIPFS_VOLUME_LEN) || strncmp(path, ZIPFS_VOLUME, ZIPFS_VOLUME_LEN) ) ? -1 : TCL_OK; if (decrRef) { Tcl_DecrRefCount(pathPtr); } return ret; } /* *------------------------------------------------------------------------- * * ZipFSListVolumesProc -- * |
︙ | ︙ | |||
6198 6199 6200 6201 6202 6203 6204 | { #ifdef HAVE_ZLIB static const EnsembleImplMap initMap[] = { {"mkimg", ZipFSMkImgObjCmd, NULL, NULL, NULL, 1}, {"mkzip", ZipFSMkZipObjCmd, NULL, NULL, NULL, 1}, {"lmkimg", ZipFSLMkImgObjCmd, NULL, NULL, NULL, 1}, {"lmkzip", ZipFSLMkZipObjCmd, NULL, NULL, NULL, 1}, | < | | | | | | | > > | 6230 6231 6232 6233 6234 6235 6236 6237 6238 6239 6240 6241 6242 6243 6244 6245 6246 6247 6248 6249 6250 6251 6252 6253 6254 6255 6256 6257 6258 6259 6260 6261 | { #ifdef HAVE_ZLIB static const EnsembleImplMap initMap[] = { {"mkimg", ZipFSMkImgObjCmd, NULL, NULL, NULL, 1}, {"mkzip", ZipFSMkZipObjCmd, NULL, NULL, NULL, 1}, {"lmkimg", ZipFSLMkImgObjCmd, NULL, NULL, NULL, 1}, {"lmkzip", ZipFSLMkZipObjCmd, NULL, NULL, NULL, 1}, {"mount", ZipFSMountObjCmd, NULL, NULL, NULL, 1}, {"mountdata", ZipFSMountBufferObjCmd, NULL, NULL, NULL, 1}, {"unmount", ZipFSUnmountObjCmd, NULL, NULL, NULL, 1}, {"mkkey", ZipFSMkKeyObjCmd, NULL, NULL, NULL, 1}, {"exists", ZipFSExistsObjCmd, NULL, NULL, NULL, 1}, {"info", ZipFSInfoObjCmd, NULL, NULL, NULL, 1}, {"list", ZipFSListObjCmd, NULL, NULL, NULL, 1}, {"canonical", ZipFSCanonicalObjCmd, NULL, NULL, NULL, 1}, {"root", ZipFSRootObjCmd, NULL, NULL, NULL, 1}, {NULL, NULL, NULL, NULL, NULL, 0} }; static const char findproc[] = "namespace eval ::tcl::zipfs {}\n" "proc ::tcl::zipfs::Find dir {\n" " set result {}\n" " if {[catch {\n" " concat [glob -directory $dir -nocomplain *] [glob -directory $dir -types hidden -nocomplain *]\n" " } list]} {\n" " return $result\n" " }\n" " foreach file $list {\n" " if {[file tail $file] in {. ..}} {\n" " continue\n" " }\n" " lappend result $file {*}[Find $file]\n" |
︙ | ︙ | |||
6261 6262 6263 6264 6265 6266 6267 | * Add the [zipfs find] subcommand. */ Tcl_GetEnsembleMappingDict(NULL, ensemble, &mapObj); TclDictPutString(NULL, mapObj, "find", "::tcl::zipfs::find"); Tcl_CreateObjCommand(interp, "::tcl::zipfs::tcl_library_init", ZipFSTclLibraryObjCmd, NULL, NULL); | < | 6294 6295 6296 6297 6298 6299 6300 6301 6302 6303 6304 6305 6306 6307 | * Add the [zipfs find] subcommand. */ Tcl_GetEnsembleMappingDict(NULL, ensemble, &mapObj); TclDictPutString(NULL, mapObj, "find", "::tcl::zipfs::find"); Tcl_CreateObjCommand(interp, "::tcl::zipfs::tcl_library_init", ZipFSTclLibraryObjCmd, NULL, NULL); } return TCL_OK; #else /* !HAVE_ZLIB */ ZIPFS_ERROR(interp, "no zlib available"); ZIPFS_ERROR_CODE(interp, "NO_ZLIB"); return TCL_ERROR; #endif /* HAVE_ZLIB */ |
︙ | ︙ |
Changes to generic/tclZlib.c.
︙ | ︙ | |||
12 13 14 15 16 17 18 | * * See the file "license.terms" for information on usage and redistribution of * this file, and for a DISCLAIMER OF ALL WARRANTIES. */ #include "tclInt.h" #ifdef HAVE_ZLIB | | | 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | * * See the file "license.terms" for information on usage and redistribution of * this file, and for a DISCLAIMER OF ALL WARRANTIES. */ #include "tclInt.h" #ifdef HAVE_ZLIB #include "zlib.h" #include "tclIO.h" /* * The version of the zlib "package" that this implements. Note that this * thoroughly supersedes the versions included with tclkit, which are "1.1", * so this is at least "2.0" (there's no general *commitment* to have the same * interface, even if that is mostly true). |
︙ | ︙ | |||
2697 2698 2699 2700 2701 2702 2703 | return TCL_OK; case zs_checksum: /* $strm checksum */ if (objc != 2) { Tcl_WrongNumArgs(interp, 2, objv, NULL); return TCL_ERROR; } Tcl_SetObjResult(interp, Tcl_NewWideIntObj( | | | 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 | return TCL_OK; case zs_checksum: /* $strm checksum */ if (objc != 2) { Tcl_WrongNumArgs(interp, 2, objv, NULL); return TCL_ERROR; } Tcl_SetObjResult(interp, Tcl_NewWideIntObj( (uint32_t) Tcl_ZlibStreamChecksum(zstream))); return TCL_OK; case zs_reset: /* $strm reset */ if (objc != 2) { Tcl_WrongNumArgs(interp, 2, objv, NULL); return TCL_ERROR; } return Tcl_ZlibStreamReset(zstream); |
︙ | ︙ |
Changes to library/clock.tcl.
︙ | ︙ | |||
667 668 669 670 671 672 673 | # Helper that checks whether registry module is available (Windows only) # and loads it on demand. # #---------------------------------------------------------------------- proc ::tcl::clock::_hasRegistry {} { set res 0 if { $::tcl_platform(platform) eq {windows} } { | | | | | 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 | # Helper that checks whether registry module is available (Windows only) # and loads it on demand. # #---------------------------------------------------------------------- proc ::tcl::clock::_hasRegistry {} { set res 0 if { $::tcl_platform(platform) eq {windows} } { if { [catch { package require registry 1.3 }] } { # try to load registry directly from root (if uninstalled / development env): if {[regexp {[/\\]library$} [info library]]} {catch { load [lindex \ [glob -tails -directory [file dirname [info nameofexecutable]] \ tcl9registry*[expr {[::tcl::pkgconfig get debug] ? {g} : {}}].dll] 0 \ ] Registry }} } if { [namespace which -command ::registry] ne "" } { set res 1 } } proc ::tcl::clock::_hasRegistry {} [list return $res] |
︙ | ︙ |
Changes to library/http/http.tcl.
1 2 3 4 5 6 7 8 9 10 11 12 13 | # http.tcl -- # # Client-side HTTP for GET, POST, and HEAD commands. These routines can # be used in untrusted code that uses the Safesock security policy. # These procedures use a callback interface to avoid using vwait, which # is not defined in the safe base. # # See the file "license.terms" for information on usage and redistribution of # this file, and for a DISCLAIMER OF ALL WARRANTIES. package require Tcl 8.6- # Keep this in sync with pkgIndex.tcl and with the install directories in # Makefiles | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | # http.tcl -- # # Client-side HTTP for GET, POST, and HEAD commands. These routines can # be used in untrusted code that uses the Safesock security policy. # These procedures use a callback interface to avoid using vwait, which # is not defined in the safe base. # # See the file "license.terms" for information on usage and redistribution of # this file, and for a DISCLAIMER OF ALL WARRANTIES. package require Tcl 8.6- # Keep this in sync with pkgIndex.tcl and with the install directories in # Makefiles package provide http 2.10b4 namespace eval http { # Allow resourcing to not clobber existing data variable http if {![info exists http]} { array set http { |
︙ | ︙ |
Changes to library/http/pkgIndex.tcl.
1 | if {![package vsatisfies [package provide Tcl] 8.6-]} {return} | | | 1 2 | if {![package vsatisfies [package provide Tcl] 8.6-]} {return} package ifneeded http 2.10b4 [list tclPkgSetup $dir http 2.10b4 {{http.tcl source {::http::config ::http::formatQuery ::http::geturl ::http::reset ::http::wait ::http::register ::http::unregister ::http::mapReply}}}] |
Changes to library/init.tcl.
︙ | ︙ | |||
11 12 13 14 15 16 17 | # # All rights reserved. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # | | | 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | # # All rights reserved. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # package require -exact tcl 9.0b4 # Compute the auto path to use in this interpreter. # The values on the path come from several locations: # # The environment variable TCLLIBPATH # # tcl_library, which is the directory containing this init.tcl script. |
︙ | ︙ |
Changes to library/manifest.txt.
1 2 3 4 5 6 | ### # Package manifest for all Tcl packages included in the /library file system ### apply {{dir} { set isafe [interp issafe] foreach {safe package version file} { | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | ### # Package manifest for all Tcl packages included in the /library file system ### apply {{dir} { set isafe [interp issafe] foreach {safe package version file} { 0 http 2.10b4 {http http.tcl} 1 msgcat 1.7.1 {msgcat msgcat.tcl} 1 opt 0.4.9 {opt optparse.tcl} 0 cookiejar 0.2.0 {cookiejar cookiejar.tcl} 0 tcl::idna 1.0.1 {cookiejar idna.tcl} 0 platform 1.0.19 {platform platform.tcl} 0 platform::shell 1.1.4 {platform shell.tcl} 1 tcltest 2.5.8 {tcltest tcltest.tcl} |
︙ | ︙ |
Changes to library/msgcat/msgcat.tcl.
︙ | ︙ | |||
1222 1223 1224 1225 1226 1227 1228 | proc ::msgcat::PackageNamespaceGet {} { set ns [uplevel 2 { namespace current }] if {![string match {::oo::*} $ns]} { # Not in object environment return $ns } | | > > | | | | | | | | | | | | | | | | < < < > > | 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 | proc ::msgcat::PackageNamespaceGet {} { set ns [uplevel 2 { namespace current }] if {![string match {::oo::*} $ns]} { # Not in object environment return $ns } # Ticket 91b3a5bb14: call to self may fail if namespace is stored # so catch all this try { # Check self namespace to determine environment switch -exact -- [uplevel 2 { namespace which -command self }] { {::oo::define::self} { # We are within a class definition return [namespace qualifiers [uplevel 2 { self }]] } {::oo::Helpers::self} { # We are within an object set Class [info object class [uplevel 2 { self }]] # Check for classless defined object if {$Class eq {::oo::object}} { return [namespace qualifiers [uplevel 2 { self }]] } # Class defined object return [namespace qualifiers $Class] } } } on error {} { } return $ns } # Initialize the default locale proc msgcat::mcutil::getsystemlocale {} { global env # |
︙ | ︙ |
Changes to library/tzdata/Africa/Bissau.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Africa/Bissau) { {-9223372036854775808 -3740 0 LMT} | | | 1 2 3 4 5 6 7 | # created by tools/tclZIC.tcl - do not edit set TZData(:Africa/Bissau) { {-9223372036854775808 -3740 0 LMT} {-1830380400 -3600 0 %z} {157770000 0 0 GMT} } |
Changes to library/tzdata/Africa/Casablanca.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Africa/Casablanca) { {-9223372036854775808 -1820 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 | # created by tools/tclZIC.tcl - do not edit set TZData(:Africa/Casablanca) { {-9223372036854775808 -1820 0 LMT} {-1773012580 0 0 %z} {-956361600 3600 1 %z} {-950490000 0 0 %z} {-942019200 3600 1 %z} {-761187600 0 0 %z} {-617241600 3600 1 %z} {-605149200 0 0 %z} {-81432000 3600 1 %z} {-71110800 0 0 %z} {141264000 3600 1 %z} {147222000 0 0 %z} {199756800 3600 1 %z} {207702000 0 0 %z} {231292800 3600 1 %z} {244249200 0 0 %z} {265507200 3600 1 %z} {271033200 0 0 %z} {448243200 3600 0 %z} {504918000 0 0 %z} {1212278400 3600 1 %z} {1220223600 0 0 %z} {1243814400 3600 1 %z} {1250809200 0 0 %z} {1272758400 3600 1 %z} {1281222000 0 0 %z} {1301788800 3600 1 %z} {1312066800 0 0 %z} {1335664800 3600 1 %z} {1342749600 0 0 %z} {1345428000 3600 1 %z} {1348970400 0 0 %z} {1367114400 3600 1 %z} {1373162400 0 0 %z} {1376100000 3600 1 %z} {1382839200 0 0 %z} {1396144800 3600 1 %z} {1403920800 0 0 %z} {1406944800 3600 1 %z} {1414288800 0 0 %z} {1427594400 3600 1 %z} {1434247200 0 0 %z} {1437271200 3600 1 %z} {1445738400 0 0 %z} {1459044000 3600 1 %z} {1465092000 0 0 %z} {1468116000 3600 1 %z} {1477792800 0 0 %z} {1490493600 3600 1 %z} {1495332000 0 0 %z} {1498960800 3600 1 %z} {1509242400 0 0 %z} {1521943200 3600 1 %z} {1526176800 0 0 %z} {1529200800 3600 1 %z} {1540695600 3600 0 %z} {1557021600 0 1 %z} {1560045600 3600 0 %z} {1587261600 0 1 %z} {1590890400 3600 0 %z} {1618106400 0 1 %z} {1621130400 3600 0 %z} {1648346400 0 1 %z} {1651975200 3600 0 %z} {1679191200 0 1 %z} {1682215200 3600 0 %z} {1710036000 0 1 %z} {1713060000 3600 0 %z} {1740276000 0 1 %z} {1743904800 3600 0 %z} {1771120800 0 1 %z} {1774144800 3600 0 %z} {1801965600 0 1 %z} {1804989600 3600 0 %z} {1832205600 0 1 %z} {1835834400 3600 0 %z} {1863050400 0 1 %z} {1866074400 3600 0 %z} {1893290400 0 1 %z} {1896919200 3600 0 %z} {1924135200 0 1 %z} {1927159200 3600 0 %z} {1954980000 0 1 %z} {1958004000 3600 0 %z} {1985220000 0 1 %z} {1988848800 3600 0 %z} {2016064800 0 1 %z} {2019088800 3600 0 %z} {2046304800 0 1 %z} {2049933600 3600 0 %z} {2077149600 0 1 %z} {2080778400 3600 0 %z} {2107994400 0 1 %z} {2111018400 3600 0 %z} {2138234400 0 1 %z} {2141863200 3600 0 %z} {2169079200 0 1 %z} {2172103200 3600 0 %z} {2199924000 0 1 %z} {2202948000 3600 0 %z} {2230164000 0 1 %z} {2233792800 3600 0 %z} {2261008800 0 1 %z} {2264032800 3600 0 %z} {2291248800 0 1 %z} {2294877600 3600 0 %z} {2322093600 0 1 %z} {2325722400 3600 0 %z} {2352938400 0 1 %z} {2355962400 3600 0 %z} {2383178400 0 1 %z} {2386807200 3600 0 %z} {2414023200 0 1 %z} {2417047200 3600 0 %z} {2444868000 0 1 %z} {2447892000 3600 0 %z} {2475108000 0 1 %z} {2478736800 3600 0 %z} {2505952800 0 1 %z} {2508976800 3600 0 %z} {2536192800 0 1 %z} {2539821600 3600 0 %z} {2567037600 0 1 %z} {2570666400 3600 0 %z} {2597882400 0 1 %z} {2600906400 3600 0 %z} {2628122400 0 1 %z} {2631751200 3600 0 %z} {2658967200 0 1 %z} {2661991200 3600 0 %z} {2689812000 0 1 %z} {2692836000 3600 0 %z} {2720052000 0 1 %z} {2723680800 3600 0 %z} {2750896800 0 1 %z} {2753920800 3600 0 %z} {2781136800 0 1 %z} {2784765600 3600 0 %z} {2811981600 0 1 %z} {2815610400 3600 0 %z} {2842826400 0 1 %z} {2845850400 3600 0 %z} {2873066400 0 1 %z} {2876695200 3600 0 %z} {2903911200 0 1 %z} {2906935200 3600 0 %z} {2934756000 0 1 %z} {2937780000 3600 0 %z} {2964996000 0 1 %z} {2968624800 3600 0 %z} {2995840800 0 1 %z} {2998864800 3600 0 %z} {3026080800 0 1 %z} {3029709600 3600 0 %z} {3056925600 0 1 %z} {3060554400 3600 0 %z} {3087770400 0 1 %z} {3090794400 3600 0 %z} {3118010400 0 1 %z} {3121639200 3600 0 %z} {3148855200 0 1 %z} {3151879200 3600 0 %z} {3179700000 0 1 %z} {3182724000 3600 0 %z} {3209940000 0 1 %z} {3213568800 3600 0 %z} {3240784800 0 1 %z} {3243808800 3600 0 %z} {3271024800 0 1 %z} {3274653600 3600 0 %z} {3301869600 0 1 %z} {3305498400 3600 0 %z} {3332714400 0 1 %z} {3335738400 3600 0 %z} {3362954400 0 1 %z} {3366583200 3600 0 %z} {3393799200 0 1 %z} {3396823200 3600 0 %z} {3424644000 0 1 %z} {3427668000 3600 0 %z} {3454884000 0 1 %z} {3458512800 3600 0 %z} {3485728800 0 1 %z} {3488752800 3600 0 %z} {3515968800 0 1 %z} {3519597600 3600 0 %z} {3546813600 0 1 %z} {3549837600 3600 0 %z} {3577658400 0 1 %z} {3580682400 3600 0 %z} {3607898400 0 1 %z} {3611527200 3600 0 %z} {3638743200 0 1 %z} {3641767200 3600 0 %z} {3669588000 0 1 %z} {3672612000 3600 0 %z} {3699828000 0 1 %z} {3703456800 3600 0 %z} } |
Changes to library/tzdata/Africa/El_Aaiun.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Africa/El_Aaiun) { {-9223372036854775808 -3168 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 | # created by tools/tclZIC.tcl - do not edit set TZData(:Africa/El_Aaiun) { {-9223372036854775808 -3168 0 LMT} {-1136070432 -3600 0 %z} {198291600 0 0 %z} {199756800 3600 1 %z} {207702000 0 0 %z} {231292800 3600 1 %z} {244249200 0 0 %z} {265507200 3600 1 %z} {271033200 0 0 %z} {1212278400 3600 1 %z} {1220223600 0 0 %z} {1243814400 3600 1 %z} {1250809200 0 0 %z} {1272758400 3600 1 %z} {1281222000 0 0 %z} {1301788800 3600 1 %z} {1312066800 0 0 %z} {1335664800 3600 1 %z} {1342749600 0 0 %z} {1345428000 3600 1 %z} {1348970400 0 0 %z} {1367114400 3600 1 %z} {1373162400 0 0 %z} {1376100000 3600 1 %z} {1382839200 0 0 %z} {1396144800 3600 1 %z} {1403920800 0 0 %z} {1406944800 3600 1 %z} {1414288800 0 0 %z} {1427594400 3600 1 %z} {1434247200 0 0 %z} {1437271200 3600 1 %z} {1445738400 0 0 %z} {1459044000 3600 1 %z} {1465092000 0 0 %z} {1468116000 3600 1 %z} {1477792800 0 0 %z} {1490493600 3600 1 %z} {1495332000 0 0 %z} {1498960800 3600 1 %z} {1509242400 0 0 %z} {1521943200 3600 1 %z} {1526176800 0 0 %z} {1529200800 3600 1 %z} {1540695600 3600 0 %z} {1557021600 0 1 %z} {1560045600 3600 0 %z} {1587261600 0 1 %z} {1590890400 3600 0 %z} {1618106400 0 1 %z} {1621130400 3600 0 %z} {1648346400 0 1 %z} {1651975200 3600 0 %z} {1679191200 0 1 %z} {1682215200 3600 0 %z} {1710036000 0 1 %z} {1713060000 3600 0 %z} {1740276000 0 1 %z} {1743904800 3600 0 %z} {1771120800 0 1 %z} {1774144800 3600 0 %z} {1801965600 0 1 %z} {1804989600 3600 0 %z} {1832205600 0 1 %z} {1835834400 3600 0 %z} {1863050400 0 1 %z} {1866074400 3600 0 %z} {1893290400 0 1 %z} {1896919200 3600 0 %z} {1924135200 0 1 %z} {1927159200 3600 0 %z} {1954980000 0 1 %z} {1958004000 3600 0 %z} {1985220000 0 1 %z} {1988848800 3600 0 %z} {2016064800 0 1 %z} {2019088800 3600 0 %z} {2046304800 0 1 %z} {2049933600 3600 0 %z} {2077149600 0 1 %z} {2080778400 3600 0 %z} {2107994400 0 1 %z} {2111018400 3600 0 %z} {2138234400 0 1 %z} {2141863200 3600 0 %z} {2169079200 0 1 %z} {2172103200 3600 0 %z} {2199924000 0 1 %z} {2202948000 3600 0 %z} {2230164000 0 1 %z} {2233792800 3600 0 %z} {2261008800 0 1 %z} {2264032800 3600 0 %z} {2291248800 0 1 %z} {2294877600 3600 0 %z} {2322093600 0 1 %z} {2325722400 3600 0 %z} {2352938400 0 1 %z} {2355962400 3600 0 %z} {2383178400 0 1 %z} {2386807200 3600 0 %z} {2414023200 0 1 %z} {2417047200 3600 0 %z} {2444868000 0 1 %z} {2447892000 3600 0 %z} {2475108000 0 1 %z} {2478736800 3600 0 %z} {2505952800 0 1 %z} {2508976800 3600 0 %z} {2536192800 0 1 %z} {2539821600 3600 0 %z} {2567037600 0 1 %z} {2570666400 3600 0 %z} {2597882400 0 1 %z} {2600906400 3600 0 %z} {2628122400 0 1 %z} {2631751200 3600 0 %z} {2658967200 0 1 %z} {2661991200 3600 0 %z} {2689812000 0 1 %z} {2692836000 3600 0 %z} {2720052000 0 1 %z} {2723680800 3600 0 %z} {2750896800 0 1 %z} {2753920800 3600 0 %z} {2781136800 0 1 %z} {2784765600 3600 0 %z} {2811981600 0 1 %z} {2815610400 3600 0 %z} {2842826400 0 1 %z} {2845850400 3600 0 %z} {2873066400 0 1 %z} {2876695200 3600 0 %z} {2903911200 0 1 %z} {2906935200 3600 0 %z} {2934756000 0 1 %z} {2937780000 3600 0 %z} {2964996000 0 1 %z} {2968624800 3600 0 %z} {2995840800 0 1 %z} {2998864800 3600 0 %z} {3026080800 0 1 %z} {3029709600 3600 0 %z} {3056925600 0 1 %z} {3060554400 3600 0 %z} {3087770400 0 1 %z} {3090794400 3600 0 %z} {3118010400 0 1 %z} {3121639200 3600 0 %z} {3148855200 0 1 %z} {3151879200 3600 0 %z} {3179700000 0 1 %z} {3182724000 3600 0 %z} {3209940000 0 1 %z} {3213568800 3600 0 %z} {3240784800 0 1 %z} {3243808800 3600 0 %z} {3271024800 0 1 %z} {3274653600 3600 0 %z} {3301869600 0 1 %z} {3305498400 3600 0 %z} {3332714400 0 1 %z} {3335738400 3600 0 %z} {3362954400 0 1 %z} {3366583200 3600 0 %z} {3393799200 0 1 %z} {3396823200 3600 0 %z} {3424644000 0 1 %z} {3427668000 3600 0 %z} {3454884000 0 1 %z} {3458512800 3600 0 %z} {3485728800 0 1 %z} {3488752800 3600 0 %z} {3515968800 0 1 %z} {3519597600 3600 0 %z} {3546813600 0 1 %z} {3549837600 3600 0 %z} {3577658400 0 1 %z} {3580682400 3600 0 %z} {3607898400 0 1 %z} {3611527200 3600 0 %z} {3638743200 0 1 %z} {3641767200 3600 0 %z} {3669588000 0 1 %z} {3672612000 3600 0 %z} {3699828000 0 1 %z} {3703456800 3600 0 %z} } |
Changes to library/tzdata/Africa/Lagos.
1 2 3 4 5 6 | # created by tools/tclZIC.tcl - do not edit set TZData(:Africa/Lagos) { {-9223372036854775808 815 0 LMT} {-2035584815 0 0 GMT} {-1940889600 815 0 LMT} | | | 1 2 3 4 5 6 7 8 9 | # created by tools/tclZIC.tcl - do not edit set TZData(:Africa/Lagos) { {-9223372036854775808 815 0 LMT} {-2035584815 0 0 GMT} {-1940889600 815 0 LMT} {-1767226415 1800 0 %z} {-1588465800 3600 0 WAT} } |
Changes to library/tzdata/Africa/Maputo.
1 2 3 | # created by tools/tclZIC.tcl - do not edit set TZData(:Africa/Maputo) { | | | | 1 2 3 4 5 6 | # created by tools/tclZIC.tcl - do not edit set TZData(:Africa/Maputo) { {-9223372036854775808 7818 0 LMT} {-1924999818 7200 0 CAT} } |
Changes to library/tzdata/Africa/Nairobi.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Africa/Nairobi) { {-9223372036854775808 8836 0 LMT} | | | | | 1 2 3 4 5 6 7 8 9 10 | # created by tools/tclZIC.tcl - do not edit set TZData(:Africa/Nairobi) { {-9223372036854775808 8836 0 LMT} {-1946168836 9000 0 %z} {-1309746600 10800 0 EAT} {-1261969200 9000 0 %z} {-1041388200 9900 0 %z} {-865305900 10800 0 EAT} } |
Changes to library/tzdata/Africa/Windhoek.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Africa/Windhoek) { {-9223372036854775808 4104 0 LMT} | | | 1 2 3 4 5 6 7 8 9 10 11 12 | # created by tools/tclZIC.tcl - do not edit set TZData(:Africa/Windhoek) { {-9223372036854775808 4104 0 LMT} {-2458170504 5400 0 %z} {-2109288600 7200 0 SAST} {-860976000 10800 1 SAST} {-845254800 7200 0 SAST} {637970400 7200 0 CAT} {764200800 3600 1 WAT} {778640400 7200 0 CAT} {796780800 3600 1 WAT} |
︙ | ︙ |
Changes to library/tzdata/America/Araguaina.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Araguaina) { {-9223372036854775808 -11568 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Araguaina) { {-9223372036854775808 -11568 0 LMT} {-1767214032 -10800 0 %z} {-1206957600 -7200 1 %z} {-1191362400 -10800 0 %z} {-1175374800 -7200 1 %z} {-1159826400 -10800 0 %z} {-633819600 -7200 1 %z} {-622069200 -10800 0 %z} {-602283600 -7200 1 %z} {-591832800 -10800 0 %z} {-570747600 -7200 1 %z} {-560210400 -10800 0 %z} {-539125200 -7200 1 %z} {-531352800 -10800 0 %z} {-191365200 -7200 1 %z} {-184197600 -10800 0 %z} {-155163600 -7200 1 %z} {-150069600 -10800 0 %z} {-128898000 -7200 1 %z} {-121125600 -10800 0 %z} {-99954000 -7200 1 %z} {-89589600 -10800 0 %z} {-68418000 -7200 1 %z} {-57967200 -10800 0 %z} {499748400 -7200 1 %z} {511236000 -10800 0 %z} {530593200 -7200 1 %z} {540266400 -10800 0 %z} {562129200 -7200 1 %z} {571197600 -10800 0 %z} {592974000 -7200 1 %z} {602042400 -10800 0 %z} {624423600 -7200 1 %z} {634701600 -10800 0 %z} {653536800 -10800 0 %z} {811047600 -10800 0 %z} {813726000 -7200 1 %z} {824004000 -10800 0 %z} {844570800 -7200 1 %z} {856058400 -10800 0 %z} {876106800 -7200 1 %z} {888717600 -10800 0 %z} {908074800 -7200 1 %z} {919562400 -10800 0 %z} {938919600 -7200 1 %z} {951616800 -10800 0 %z} {970974000 -7200 1 %z} {982461600 -10800 0 %z} {1003028400 -7200 1 %z} {1013911200 -10800 0 %z} {1036292400 -7200 1 %z} {1045360800 -10800 0 %z} {1064368800 -10800 0 %z} {1350788400 -7200 0 %z} {1361066400 -10800 0 %z} {1378000800 -10800 0 %z} } |
Changes to library/tzdata/America/Argentina/Buenos_Aires.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Argentina/Buenos_Aires) { {-9223372036854775808 -14028 0 LMT} {-2372097972 -15408 0 CMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Argentina/Buenos_Aires) { {-9223372036854775808 -14028 0 LMT} {-2372097972 -15408 0 CMT} {-1567453392 -14400 0 %z} {-1233432000 -10800 0 %z} {-1222981200 -14400 0 %z} {-1205956800 -10800 1 %z} {-1194037200 -14400 0 %z} {-1172865600 -10800 1 %z} {-1162501200 -14400 0 %z} {-1141329600 -10800 1 %z} {-1130965200 -14400 0 %z} {-1109793600 -10800 1 %z} {-1099429200 -14400 0 %z} {-1078257600 -10800 1 %z} {-1067806800 -14400 0 %z} {-1046635200 -10800 1 %z} {-1036270800 -14400 0 %z} {-1015099200 -10800 1 %z} {-1004734800 -14400 0 %z} {-983563200 -10800 1 %z} {-973198800 -14400 0 %z} {-952027200 -10800 1 %z} {-941576400 -14400 0 %z} {-931032000 -10800 1 %z} {-900882000 -14400 0 %z} {-890337600 -10800 1 %z} {-833749200 -14400 0 %z} {-827265600 -10800 1 %z} {-752274000 -14400 0 %z} {-733780800 -10800 1 %z} {-197326800 -14400 0 %z} {-190843200 -10800 1 %z} {-184194000 -14400 0 %z} {-164491200 -10800 1 %z} {-152658000 -14400 0 %z} {-132955200 -10800 1 %z} {-121122000 -14400 0 %z} {-101419200 -10800 1 %z} {-86821200 -14400 0 %z} {-71092800 -10800 1 %z} {-54766800 -14400 0 %z} {-39038400 -10800 1 %z} {-23317200 -14400 0 %z} {-7588800 -10800 0 %z} {128142000 -7200 1 %z} {136605600 -10800 0 %z} {596948400 -7200 1 %z} {605066400 -10800 0 %z} {624423600 -7200 1 %z} {636516000 -10800 0 %z} {656478000 -7200 1 %z} {667965600 -10800 0 %z} {687927600 -7200 1 %z} {699415200 -10800 0 %z} {719377200 -7200 1 %z} {731469600 -10800 0 %z} {938916000 -10800 0 %z} {938919600 -10800 1 %z} {952056000 -10800 0 %z} {1198983600 -7200 1 %z} {1205632800 -10800 0 %z} {1224385200 -7200 1 %z} {1237082400 -10800 0 %z} } |
Changes to library/tzdata/America/Argentina/Catamarca.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Argentina/Catamarca) { {-9223372036854775808 -15788 0 LMT} {-2372096212 -15408 0 CMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Argentina/Catamarca) { {-9223372036854775808 -15788 0 LMT} {-2372096212 -15408 0 CMT} {-1567453392 -14400 0 %z} {-1233432000 -10800 0 %z} {-1222981200 -14400 0 %z} {-1205956800 -10800 1 %z} {-1194037200 -14400 0 %z} {-1172865600 -10800 1 %z} {-1162501200 -14400 0 %z} {-1141329600 -10800 1 %z} {-1130965200 -14400 0 %z} {-1109793600 -10800 1 %z} {-1099429200 -14400 0 %z} {-1078257600 -10800 1 %z} {-1067806800 -14400 0 %z} {-1046635200 -10800 1 %z} {-1036270800 -14400 0 %z} {-1015099200 -10800 1 %z} {-1004734800 -14400 0 %z} {-983563200 -10800 1 %z} {-973198800 -14400 0 %z} {-952027200 -10800 1 %z} {-941576400 -14400 0 %z} {-931032000 -10800 1 %z} {-900882000 -14400 0 %z} {-890337600 -10800 1 %z} {-833749200 -14400 0 %z} {-827265600 -10800 1 %z} {-752274000 -14400 0 %z} {-733780800 -10800 1 %z} {-197326800 -14400 0 %z} {-190843200 -10800 1 %z} {-184194000 -14400 0 %z} {-164491200 -10800 1 %z} {-152658000 -14400 0 %z} {-132955200 -10800 1 %z} {-121122000 -14400 0 %z} {-101419200 -10800 1 %z} {-86821200 -14400 0 %z} {-71092800 -10800 1 %z} {-54766800 -14400 0 %z} {-39038400 -10800 1 %z} {-23317200 -14400 0 %z} {-7588800 -10800 0 %z} {128142000 -7200 1 %z} {136605600 -10800 0 %z} {596948400 -7200 1 %z} {605066400 -10800 0 %z} {624423600 -7200 1 %z} {636516000 -10800 0 %z} {656478000 -7200 1 %z} {667965600 -14400 0 %z} {687931200 -7200 0 %z} {699415200 -10800 0 %z} {719377200 -7200 1 %z} {731469600 -10800 0 %z} {938916000 -10800 0 %z} {938919600 -10800 1 %z} {952056000 -10800 0 %z} {1086058800 -14400 0 %z} {1087704000 -10800 0 %z} {1198983600 -7200 1 %z} {1205632800 -10800 0 %z} {1224295200 -10800 0 %z} } |
Changes to library/tzdata/America/Argentina/Cordoba.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Argentina/Cordoba) { {-9223372036854775808 -15408 0 LMT} {-2372096592 -15408 0 CMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Argentina/Cordoba) { {-9223372036854775808 -15408 0 LMT} {-2372096592 -15408 0 CMT} {-1567453392 -14400 0 %z} {-1233432000 -10800 0 %z} {-1222981200 -14400 0 %z} {-1205956800 -10800 1 %z} {-1194037200 -14400 0 %z} {-1172865600 -10800 1 %z} {-1162501200 -14400 0 %z} {-1141329600 -10800 1 %z} {-1130965200 -14400 0 %z} {-1109793600 -10800 1 %z} {-1099429200 -14400 0 %z} {-1078257600 -10800 1 %z} {-1067806800 -14400 0 %z} {-1046635200 -10800 1 %z} {-1036270800 -14400 0 %z} {-1015099200 -10800 1 %z} {-1004734800 -14400 0 %z} {-983563200 -10800 1 %z} {-973198800 -14400 0 %z} {-952027200 -10800 1 %z} {-941576400 -14400 0 %z} {-931032000 -10800 1 %z} {-900882000 -14400 0 %z} {-890337600 -10800 1 %z} {-833749200 -14400 0 %z} {-827265600 -10800 1 %z} {-752274000 -14400 0 %z} {-733780800 -10800 1 %z} {-197326800 -14400 0 %z} {-190843200 -10800 1 %z} {-184194000 -14400 0 %z} {-164491200 -10800 1 %z} {-152658000 -14400 0 %z} {-132955200 -10800 1 %z} {-121122000 -14400 0 %z} {-101419200 -10800 1 %z} {-86821200 -14400 0 %z} {-71092800 -10800 1 %z} {-54766800 -14400 0 %z} {-39038400 -10800 1 %z} {-23317200 -14400 0 %z} {-7588800 -10800 0 %z} {128142000 -7200 1 %z} {136605600 -10800 0 %z} {596948400 -7200 1 %z} {605066400 -10800 0 %z} {624423600 -7200 1 %z} {636516000 -10800 0 %z} {656478000 -7200 1 %z} {667965600 -14400 0 %z} {687931200 -7200 0 %z} {699415200 -10800 0 %z} {719377200 -7200 1 %z} {731469600 -10800 0 %z} {938916000 -10800 0 %z} {938919600 -10800 1 %z} {952056000 -10800 0 %z} {1198983600 -7200 1 %z} {1205632800 -10800 0 %z} {1224385200 -7200 1 %z} {1237082400 -10800 0 %z} } |
Changes to library/tzdata/America/Argentina/Jujuy.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Argentina/Jujuy) { {-9223372036854775808 -15672 0 LMT} {-2372096328 -15408 0 CMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Argentina/Jujuy) { {-9223372036854775808 -15672 0 LMT} {-2372096328 -15408 0 CMT} {-1567453392 -14400 0 %z} {-1233432000 -10800 0 %z} {-1222981200 -14400 0 %z} {-1205956800 -10800 1 %z} {-1194037200 -14400 0 %z} {-1172865600 -10800 1 %z} {-1162501200 -14400 0 %z} {-1141329600 -10800 1 %z} {-1130965200 -14400 0 %z} {-1109793600 -10800 1 %z} {-1099429200 -14400 0 %z} {-1078257600 -10800 1 %z} {-1067806800 -14400 0 %z} {-1046635200 -10800 1 %z} {-1036270800 -14400 0 %z} {-1015099200 -10800 1 %z} {-1004734800 -14400 0 %z} {-983563200 -10800 1 %z} {-973198800 -14400 0 %z} {-952027200 -10800 1 %z} {-941576400 -14400 0 %z} {-931032000 -10800 1 %z} {-900882000 -14400 0 %z} {-890337600 -10800 1 %z} {-833749200 -14400 0 %z} {-827265600 -10800 1 %z} {-752274000 -14400 0 %z} {-733780800 -10800 1 %z} {-197326800 -14400 0 %z} {-190843200 -10800 1 %z} {-184194000 -14400 0 %z} {-164491200 -10800 1 %z} {-152658000 -14400 0 %z} {-132955200 -10800 1 %z} {-121122000 -14400 0 %z} {-101419200 -10800 1 %z} {-86821200 -14400 0 %z} {-71092800 -10800 1 %z} {-54766800 -14400 0 %z} {-39038400 -10800 1 %z} {-23317200 -14400 0 %z} {-7588800 -10800 0 %z} {128142000 -7200 1 %z} {136605600 -10800 0 %z} {596948400 -7200 1 %z} {605066400 -10800 0 %z} {624423600 -7200 1 %z} {636516000 -14400 0 %z} {657086400 -10800 1 %z} {669178800 -14400 0 %z} {686721600 -7200 1 %z} {694231200 -7200 0 %z} {699415200 -10800 0 %z} {719377200 -7200 1 %z} {731469600 -10800 0 %z} {938916000 -10800 0 %z} {938919600 -10800 1 %z} {952056000 -10800 0 %z} {1198983600 -7200 1 %z} {1205632800 -10800 0 %z} {1224295200 -10800 0 %z} } |
Changes to library/tzdata/America/Argentina/La_Rioja.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Argentina/La_Rioja) { {-9223372036854775808 -16044 0 LMT} {-2372095956 -15408 0 CMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Argentina/La_Rioja) { {-9223372036854775808 -16044 0 LMT} {-2372095956 -15408 0 CMT} {-1567453392 -14400 0 %z} {-1233432000 -10800 0 %z} {-1222981200 -14400 0 %z} {-1205956800 -10800 1 %z} {-1194037200 -14400 0 %z} {-1172865600 -10800 1 %z} {-1162501200 -14400 0 %z} {-1141329600 -10800 1 %z} {-1130965200 -14400 0 %z} {-1109793600 -10800 1 %z} {-1099429200 -14400 0 %z} {-1078257600 -10800 1 %z} {-1067806800 -14400 0 %z} {-1046635200 -10800 1 %z} {-1036270800 -14400 0 %z} {-1015099200 -10800 1 %z} {-1004734800 -14400 0 %z} {-983563200 -10800 1 %z} {-973198800 -14400 0 %z} {-952027200 -10800 1 %z} {-941576400 -14400 0 %z} {-931032000 -10800 1 %z} {-900882000 -14400 0 %z} {-890337600 -10800 1 %z} {-833749200 -14400 0 %z} {-827265600 -10800 1 %z} {-752274000 -14400 0 %z} {-733780800 -10800 1 %z} {-197326800 -14400 0 %z} {-190843200 -10800 1 %z} {-184194000 -14400 0 %z} {-164491200 -10800 1 %z} {-152658000 -14400 0 %z} {-132955200 -10800 1 %z} {-121122000 -14400 0 %z} {-101419200 -10800 1 %z} {-86821200 -14400 0 %z} {-71092800 -10800 1 %z} {-54766800 -14400 0 %z} {-39038400 -10800 1 %z} {-23317200 -14400 0 %z} {-7588800 -10800 0 %z} {128142000 -7200 1 %z} {136605600 -10800 0 %z} {596948400 -7200 1 %z} {605066400 -10800 0 %z} {624423600 -7200 1 %z} {636516000 -10800 0 %z} {656478000 -7200 1 %z} {667792800 -14400 0 %z} {673588800 -10800 0 %z} {687927600 -7200 1 %z} {699415200 -10800 0 %z} {719377200 -7200 1 %z} {731469600 -10800 0 %z} {938916000 -10800 0 %z} {938919600 -10800 1 %z} {952056000 -10800 0 %z} {1086058800 -14400 0 %z} {1087704000 -10800 0 %z} {1198983600 -7200 1 %z} {1205632800 -10800 0 %z} {1224295200 -10800 0 %z} } |
Changes to library/tzdata/America/Argentina/Mendoza.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Argentina/Mendoza) { {-9223372036854775808 -16516 0 LMT} {-2372095484 -15408 0 CMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Argentina/Mendoza) { {-9223372036854775808 -16516 0 LMT} {-2372095484 -15408 0 CMT} {-1567453392 -14400 0 %z} {-1233432000 -10800 0 %z} {-1222981200 -14400 0 %z} {-1205956800 -10800 1 %z} {-1194037200 -14400 0 %z} {-1172865600 -10800 1 %z} {-1162501200 -14400 0 %z} {-1141329600 -10800 1 %z} {-1130965200 -14400 0 %z} {-1109793600 -10800 1 %z} {-1099429200 -14400 0 %z} {-1078257600 -10800 1 %z} {-1067806800 -14400 0 %z} {-1046635200 -10800 1 %z} {-1036270800 -14400 0 %z} {-1015099200 -10800 1 %z} {-1004734800 -14400 0 %z} {-983563200 -10800 1 %z} {-973198800 -14400 0 %z} {-952027200 -10800 1 %z} {-941576400 -14400 0 %z} {-931032000 -10800 1 %z} {-900882000 -14400 0 %z} {-890337600 -10800 1 %z} {-833749200 -14400 0 %z} {-827265600 -10800 1 %z} {-752274000 -14400 0 %z} {-733780800 -10800 1 %z} {-197326800 -14400 0 %z} {-190843200 -10800 1 %z} {-184194000 -14400 0 %z} {-164491200 -10800 1 %z} {-152658000 -14400 0 %z} {-132955200 -10800 1 %z} {-121122000 -14400 0 %z} {-101419200 -10800 1 %z} {-86821200 -14400 0 %z} {-71092800 -10800 1 %z} {-54766800 -14400 0 %z} {-39038400 -10800 1 %z} {-23317200 -14400 0 %z} {-7588800 -10800 0 %z} {128142000 -7200 1 %z} {136605600 -10800 0 %z} {596948400 -7200 1 %z} {605066400 -10800 0 %z} {624423600 -7200 1 %z} {636516000 -14400 0 %z} {655963200 -10800 1 %z} {667796400 -14400 0 %z} {687499200 -10800 1 %z} {699418800 -14400 0 %z} {719380800 -7200 0 %z} {731469600 -10800 0 %z} {938916000 -10800 0 %z} {938919600 -10800 1 %z} {952056000 -10800 0 %z} {1085281200 -14400 0 %z} {1096171200 -10800 0 %z} {1198983600 -7200 1 %z} {1205632800 -10800 0 %z} {1224295200 -10800 0 %z} } |
Changes to library/tzdata/America/Argentina/Rio_Gallegos.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Argentina/Rio_Gallegos) { {-9223372036854775808 -16612 0 LMT} {-2372095388 -15408 0 CMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Argentina/Rio_Gallegos) { {-9223372036854775808 -16612 0 LMT} {-2372095388 -15408 0 CMT} {-1567453392 -14400 0 %z} {-1233432000 -10800 0 %z} {-1222981200 -14400 0 %z} {-1205956800 -10800 1 %z} {-1194037200 -14400 0 %z} {-1172865600 -10800 1 %z} {-1162501200 -14400 0 %z} {-1141329600 -10800 1 %z} {-1130965200 -14400 0 %z} {-1109793600 -10800 1 %z} {-1099429200 -14400 0 %z} {-1078257600 -10800 1 %z} {-1067806800 -14400 0 %z} {-1046635200 -10800 1 %z} {-1036270800 -14400 0 %z} {-1015099200 -10800 1 %z} {-1004734800 -14400 0 %z} {-983563200 -10800 1 %z} {-973198800 -14400 0 %z} {-952027200 -10800 1 %z} {-941576400 -14400 0 %z} {-931032000 -10800 1 %z} {-900882000 -14400 0 %z} {-890337600 -10800 1 %z} {-833749200 -14400 0 %z} {-827265600 -10800 1 %z} {-752274000 -14400 0 %z} {-733780800 -10800 1 %z} {-197326800 -14400 0 %z} {-190843200 -10800 1 %z} {-184194000 -14400 0 %z} {-164491200 -10800 1 %z} {-152658000 -14400 0 %z} {-132955200 -10800 1 %z} {-121122000 -14400 0 %z} {-101419200 -10800 1 %z} {-86821200 -14400 0 %z} {-71092800 -10800 1 %z} {-54766800 -14400 0 %z} {-39038400 -10800 1 %z} {-23317200 -14400 0 %z} {-7588800 -10800 0 %z} {128142000 -7200 1 %z} {136605600 -10800 0 %z} {596948400 -7200 1 %z} {605066400 -10800 0 %z} {624423600 -7200 1 %z} {636516000 -10800 0 %z} {656478000 -7200 1 %z} {667965600 -10800 0 %z} {687927600 -7200 1 %z} {699415200 -10800 0 %z} {719377200 -7200 1 %z} {731469600 -10800 0 %z} {938916000 -10800 0 %z} {938919600 -10800 1 %z} {952056000 -10800 0 %z} {1086058800 -14400 0 %z} {1087704000 -10800 0 %z} {1198983600 -7200 1 %z} {1205632800 -10800 0 %z} {1224295200 -10800 0 %z} } |
Changes to library/tzdata/America/Argentina/Salta.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Argentina/Salta) { {-9223372036854775808 -15700 0 LMT} {-2372096300 -15408 0 CMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Argentina/Salta) { {-9223372036854775808 -15700 0 LMT} {-2372096300 -15408 0 CMT} {-1567453392 -14400 0 %z} {-1233432000 -10800 0 %z} {-1222981200 -14400 0 %z} {-1205956800 -10800 1 %z} {-1194037200 -14400 0 %z} {-1172865600 -10800 1 %z} {-1162501200 -14400 0 %z} {-1141329600 -10800 1 %z} {-1130965200 -14400 0 %z} {-1109793600 -10800 1 %z} {-1099429200 -14400 0 %z} {-1078257600 -10800 1 %z} {-1067806800 -14400 0 %z} {-1046635200 -10800 1 %z} {-1036270800 -14400 0 %z} {-1015099200 -10800 1 %z} {-1004734800 -14400 0 %z} {-983563200 -10800 1 %z} {-973198800 -14400 0 %z} {-952027200 -10800 1 %z} {-941576400 -14400 0 %z} {-931032000 -10800 1 %z} {-900882000 -14400 0 %z} {-890337600 -10800 1 %z} {-833749200 -14400 0 %z} {-827265600 -10800 1 %z} {-752274000 -14400 0 %z} {-733780800 -10800 1 %z} {-197326800 -14400 0 %z} {-190843200 -10800 1 %z} {-184194000 -14400 0 %z} {-164491200 -10800 1 %z} {-152658000 -14400 0 %z} {-132955200 -10800 1 %z} {-121122000 -14400 0 %z} {-101419200 -10800 1 %z} {-86821200 -14400 0 %z} {-71092800 -10800 1 %z} {-54766800 -14400 0 %z} {-39038400 -10800 1 %z} {-23317200 -14400 0 %z} {-7588800 -10800 0 %z} {128142000 -7200 1 %z} {136605600 -10800 0 %z} {596948400 -7200 1 %z} {605066400 -10800 0 %z} {624423600 -7200 1 %z} {636516000 -10800 0 %z} {656478000 -7200 1 %z} {667965600 -14400 0 %z} {687931200 -7200 0 %z} {699415200 -10800 0 %z} {719377200 -7200 1 %z} {731469600 -10800 0 %z} {938916000 -10800 0 %z} {938919600 -10800 1 %z} {952056000 -10800 0 %z} {1198983600 -7200 1 %z} {1205632800 -10800 0 %z} {1224295200 -10800 0 %z} } |
Changes to library/tzdata/America/Argentina/San_Juan.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Argentina/San_Juan) { {-9223372036854775808 -16444 0 LMT} {-2372095556 -15408 0 CMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Argentina/San_Juan) { {-9223372036854775808 -16444 0 LMT} {-2372095556 -15408 0 CMT} {-1567453392 -14400 0 %z} {-1233432000 -10800 0 %z} {-1222981200 -14400 0 %z} {-1205956800 -10800 1 %z} {-1194037200 -14400 0 %z} {-1172865600 -10800 1 %z} {-1162501200 -14400 0 %z} {-1141329600 -10800 1 %z} {-1130965200 -14400 0 %z} {-1109793600 -10800 1 %z} {-1099429200 -14400 0 %z} {-1078257600 -10800 1 %z} {-1067806800 -14400 0 %z} {-1046635200 -10800 1 %z} {-1036270800 -14400 0 %z} {-1015099200 -10800 1 %z} {-1004734800 -14400 0 %z} {-983563200 -10800 1 %z} {-973198800 -14400 0 %z} {-952027200 -10800 1 %z} {-941576400 -14400 0 %z} {-931032000 -10800 1 %z} {-900882000 -14400 0 %z} {-890337600 -10800 1 %z} {-833749200 -14400 0 %z} {-827265600 -10800 1 %z} {-752274000 -14400 0 %z} {-733780800 -10800 1 %z} {-197326800 -14400 0 %z} {-190843200 -10800 1 %z} {-184194000 -14400 0 %z} {-164491200 -10800 1 %z} {-152658000 -14400 0 %z} {-132955200 -10800 1 %z} {-121122000 -14400 0 %z} {-101419200 -10800 1 %z} {-86821200 -14400 0 %z} {-71092800 -10800 1 %z} {-54766800 -14400 0 %z} {-39038400 -10800 1 %z} {-23317200 -14400 0 %z} {-7588800 -10800 0 %z} {128142000 -7200 1 %z} {136605600 -10800 0 %z} {596948400 -7200 1 %z} {605066400 -10800 0 %z} {624423600 -7200 1 %z} {636516000 -10800 0 %z} {656478000 -7200 1 %z} {667792800 -14400 0 %z} {673588800 -10800 0 %z} {687927600 -7200 1 %z} {699415200 -10800 0 %z} {719377200 -7200 1 %z} {731469600 -10800 0 %z} {938916000 -10800 0 %z} {938919600 -10800 1 %z} {952056000 -10800 0 %z} {1085972400 -14400 0 %z} {1090728000 -10800 0 %z} {1198983600 -7200 1 %z} {1205632800 -10800 0 %z} {1224295200 -10800 0 %z} } |
Changes to library/tzdata/America/Argentina/San_Luis.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Argentina/San_Luis) { {-9223372036854775808 -15924 0 LMT} {-2372096076 -15408 0 CMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Argentina/San_Luis) { {-9223372036854775808 -15924 0 LMT} {-2372096076 -15408 0 CMT} {-1567453392 -14400 0 %z} {-1233432000 -10800 0 %z} {-1222981200 -14400 0 %z} {-1205956800 -10800 1 %z} {-1194037200 -14400 0 %z} {-1172865600 -10800 1 %z} {-1162501200 -14400 0 %z} {-1141329600 -10800 1 %z} {-1130965200 -14400 0 %z} {-1109793600 -10800 1 %z} {-1099429200 -14400 0 %z} {-1078257600 -10800 1 %z} {-1067806800 -14400 0 %z} {-1046635200 -10800 1 %z} {-1036270800 -14400 0 %z} {-1015099200 -10800 1 %z} {-1004734800 -14400 0 %z} {-983563200 -10800 1 %z} {-973198800 -14400 0 %z} {-952027200 -10800 1 %z} {-941576400 -14400 0 %z} {-931032000 -10800 1 %z} {-900882000 -14400 0 %z} {-890337600 -10800 1 %z} {-833749200 -14400 0 %z} {-827265600 -10800 1 %z} {-752274000 -14400 0 %z} {-733780800 -10800 1 %z} {-197326800 -14400 0 %z} {-190843200 -10800 1 %z} {-184194000 -14400 0 %z} {-164491200 -10800 1 %z} {-152658000 -14400 0 %z} {-132955200 -10800 1 %z} {-121122000 -14400 0 %z} {-101419200 -10800 1 %z} {-86821200 -14400 0 %z} {-71092800 -10800 1 %z} {-54766800 -14400 0 %z} {-39038400 -10800 1 %z} {-23317200 -14400 0 %z} {-7588800 -10800 0 %z} {128142000 -7200 1 %z} {136605600 -10800 0 %z} {596948400 -7200 1 %z} {605066400 -10800 0 %z} {624423600 -7200 1 %z} {631159200 -7200 1 %z} {637380000 -14400 0 %z} {655963200 -10800 1 %z} {667796400 -14400 0 %z} {675748800 -10800 0 %z} {938919600 -10800 1 %z} {952052400 -10800 0 %z} {1085972400 -14400 0 %z} {1090728000 -10800 0 %z} {1198983600 -7200 1 %z} {1200880800 -10800 0 %z} {1205031600 -14400 0 %z} {1223784000 -10800 1 %z} {1236481200 -14400 0 %z} {1255233600 -10800 0 %z} } |
Changes to library/tzdata/America/Argentina/Tucuman.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Argentina/Tucuman) { {-9223372036854775808 -15652 0 LMT} {-2372096348 -15408 0 CMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Argentina/Tucuman) { {-9223372036854775808 -15652 0 LMT} {-2372096348 -15408 0 CMT} {-1567453392 -14400 0 %z} {-1233432000 -10800 0 %z} {-1222981200 -14400 0 %z} {-1205956800 -10800 1 %z} {-1194037200 -14400 0 %z} {-1172865600 -10800 1 %z} {-1162501200 -14400 0 %z} {-1141329600 -10800 1 %z} {-1130965200 -14400 0 %z} {-1109793600 -10800 1 %z} {-1099429200 -14400 0 %z} {-1078257600 -10800 1 %z} {-1067806800 -14400 0 %z} {-1046635200 -10800 1 %z} {-1036270800 -14400 0 %z} {-1015099200 -10800 1 %z} {-1004734800 -14400 0 %z} {-983563200 -10800 1 %z} {-973198800 -14400 0 %z} {-952027200 -10800 1 %z} {-941576400 -14400 0 %z} {-931032000 -10800 1 %z} {-900882000 -14400 0 %z} {-890337600 -10800 1 %z} {-833749200 -14400 0 %z} {-827265600 -10800 1 %z} {-752274000 -14400 0 %z} {-733780800 -10800 1 %z} {-197326800 -14400 0 %z} {-190843200 -10800 1 %z} {-184194000 -14400 0 %z} {-164491200 -10800 1 %z} {-152658000 -14400 0 %z} {-132955200 -10800 1 %z} {-121122000 -14400 0 %z} {-101419200 -10800 1 %z} {-86821200 -14400 0 %z} {-71092800 -10800 1 %z} {-54766800 -14400 0 %z} {-39038400 -10800 1 %z} {-23317200 -14400 0 %z} {-7588800 -10800 0 %z} {128142000 -7200 1 %z} {136605600 -10800 0 %z} {596948400 -7200 1 %z} {605066400 -10800 0 %z} {624423600 -7200 1 %z} {636516000 -10800 0 %z} {656478000 -7200 1 %z} {667965600 -14400 0 %z} {687931200 -7200 0 %z} {699415200 -10800 0 %z} {719377200 -7200 1 %z} {731469600 -10800 0 %z} {938916000 -10800 0 %z} {938919600 -10800 1 %z} {952056000 -10800 0 %z} {1086058800 -14400 0 %z} {1087099200 -10800 0 %z} {1198983600 -7200 1 %z} {1205632800 -10800 0 %z} {1224385200 -7200 1 %z} {1237082400 -10800 0 %z} } |
Changes to library/tzdata/America/Argentina/Ushuaia.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Argentina/Ushuaia) { {-9223372036854775808 -16392 0 LMT} {-2372095608 -15408 0 CMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Argentina/Ushuaia) { {-9223372036854775808 -16392 0 LMT} {-2372095608 -15408 0 CMT} {-1567453392 -14400 0 %z} {-1233432000 -10800 0 %z} {-1222981200 -14400 0 %z} {-1205956800 -10800 1 %z} {-1194037200 -14400 0 %z} {-1172865600 -10800 1 %z} {-1162501200 -14400 0 %z} {-1141329600 -10800 1 %z} {-1130965200 -14400 0 %z} {-1109793600 -10800 1 %z} {-1099429200 -14400 0 %z} {-1078257600 -10800 1 %z} {-1067806800 -14400 0 %z} {-1046635200 -10800 1 %z} {-1036270800 -14400 0 %z} {-1015099200 -10800 1 %z} {-1004734800 -14400 0 %z} {-983563200 -10800 1 %z} {-973198800 -14400 0 %z} {-952027200 -10800 1 %z} {-941576400 -14400 0 %z} {-931032000 -10800 1 %z} {-900882000 -14400 0 %z} {-890337600 -10800 1 %z} {-833749200 -14400 0 %z} {-827265600 -10800 1 %z} {-752274000 -14400 0 %z} {-733780800 -10800 1 %z} {-197326800 -14400 0 %z} {-190843200 -10800 1 %z} {-184194000 -14400 0 %z} {-164491200 -10800 1 %z} {-152658000 -14400 0 %z} {-132955200 -10800 1 %z} {-121122000 -14400 0 %z} {-101419200 -10800 1 %z} {-86821200 -14400 0 %z} {-71092800 -10800 1 %z} {-54766800 -14400 0 %z} {-39038400 -10800 1 %z} {-23317200 -14400 0 %z} {-7588800 -10800 0 %z} {128142000 -7200 1 %z} {136605600 -10800 0 %z} {596948400 -7200 1 %z} {605066400 -10800 0 %z} {624423600 -7200 1 %z} {636516000 -10800 0 %z} {656478000 -7200 1 %z} {667965600 -10800 0 %z} {687927600 -7200 1 %z} {699415200 -10800 0 %z} {719377200 -7200 1 %z} {731469600 -10800 0 %z} {938916000 -10800 0 %z} {938919600 -10800 1 %z} {952056000 -10800 0 %z} {1085886000 -14400 0 %z} {1087704000 -10800 0 %z} {1198983600 -7200 1 %z} {1205632800 -10800 0 %z} {1224295200 -10800 0 %z} } |
Changes to library/tzdata/America/Asuncion.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Asuncion) { {-9223372036854775808 -13840 0 LMT} {-2524507760 -13840 0 AMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Asuncion) { {-9223372036854775808 -13840 0 LMT} {-2524507760 -13840 0 AMT} {-1206389360 -14400 0 %z} {86760000 -10800 0 %z} {134017200 -14400 0 %z} {162878400 -14400 0 %z} {181368000 -10800 1 %z} {194497200 -14400 0 %z} {212990400 -10800 1 %z} {226033200 -14400 0 %z} {244526400 -10800 1 %z} {257569200 -14400 0 %z} {276062400 -10800 1 %z} {291783600 -14400 0 %z} {307598400 -10800 1 %z} {323406000 -14400 0 %z} {339220800 -10800 1 %z} {354942000 -14400 0 %z} {370756800 -10800 1 %z} {386478000 -14400 0 %z} {402292800 -10800 1 %z} {418014000 -14400 0 %z} {433828800 -10800 1 %z} {449636400 -14400 0 %z} {465451200 -10800 1 %z} {481172400 -14400 0 %z} {496987200 -10800 1 %z} {512708400 -14400 0 %z} {528523200 -10800 1 %z} {544244400 -14400 0 %z} {560059200 -10800 1 %z} {575866800 -14400 0 %z} {591681600 -10800 1 %z} {607402800 -14400 0 %z} {625032000 -10800 1 %z} {638938800 -14400 0 %z} {654753600 -10800 1 %z} {670474800 -14400 0 %z} {686721600 -10800 1 %z} {699418800 -14400 0 %z} {718257600 -10800 1 %z} {733546800 -14400 0 %z} {749448000 -10800 1 %z} {762318000 -14400 0 %z} {780984000 -10800 1 %z} {793767600 -14400 0 %z} {812520000 -10800 1 %z} {825649200 -14400 0 %z} {844574400 -10800 1 %z} {856666800 -14400 0 %z} {876024000 -10800 1 %z} {888721200 -14400 0 %z} {907473600 -10800 1 %z} {920775600 -14400 0 %z} {938923200 -10800 1 %z} {952225200 -14400 0 %z} {970372800 -10800 1 %z} {983674800 -14400 0 %z} {1002427200 -10800 1 %z} {1018148400 -14400 0 %z} {1030852800 -10800 1 %z} {1049598000 -14400 0 %z} {1062907200 -10800 1 %z} {1081047600 -14400 0 %z} {1097985600 -10800 1 %z} {1110682800 -14400 0 %z} {1129435200 -10800 1 %z} {1142132400 -14400 0 %z} {1160884800 -10800 1 %z} {1173582000 -14400 0 %z} {1192939200 -10800 1 %z} {1205031600 -14400 0 %z} {1224388800 -10800 1 %z} {1236481200 -14400 0 %z} {1255838400 -10800 1 %z} {1270954800 -14400 0 %z} {1286078400 -10800 1 %z} {1302404400 -14400 0 %z} {1317528000 -10800 1 %z} {1333854000 -14400 0 %z} {1349582400 -10800 1 %z} {1364094000 -14400 0 %z} {1381032000 -10800 1 %z} {1395543600 -14400 0 %z} {1412481600 -10800 1 %z} {1426993200 -14400 0 %z} {1443931200 -10800 1 %z} {1459047600 -14400 0 %z} {1475380800 -10800 1 %z} {1490497200 -14400 0 %z} {1506830400 -10800 1 %z} {1521946800 -14400 0 %z} {1538884800 -10800 1 %z} {1553396400 -14400 0 %z} {1570334400 -10800 1 %z} {1584846000 -14400 0 %z} {1601784000 -10800 1 %z} {1616900400 -14400 0 %z} {1633233600 -10800 1 %z} {1648350000 -14400 0 %z} {1664683200 -10800 1 %z} {1679799600 -14400 0 %z} {1696132800 -10800 1 %z} {1711249200 -14400 0 %z} {1728187200 -10800 1 %z} {1742698800 -14400 0 %z} {1759636800 -10800 1 %z} {1774148400 -14400 0 %z} {1791086400 -10800 1 %z} {1806202800 -14400 0 %z} {1822536000 -10800 1 %z} {1837652400 -14400 0 %z} {1853985600 -10800 1 %z} {1869102000 -14400 0 %z} {1886040000 -10800 1 %z} {1900551600 -14400 0 %z} {1917489600 -10800 1 %z} {1932001200 -14400 0 %z} {1948939200 -10800 1 %z} {1964055600 -14400 0 %z} {1980388800 -10800 1 %z} {1995505200 -14400 0 %z} {2011838400 -10800 1 %z} {2026954800 -14400 0 %z} {2043288000 -10800 1 %z} {2058404400 -14400 0 %z} {2075342400 -10800 1 %z} {2089854000 -14400 0 %z} {2106792000 -10800 1 %z} {2121303600 -14400 0 %z} {2138241600 -10800 1 %z} {2153358000 -14400 0 %z} {2169691200 -10800 1 %z} {2184807600 -14400 0 %z} {2201140800 -10800 1 %z} {2216257200 -14400 0 %z} {2233195200 -10800 1 %z} {2247706800 -14400 0 %z} {2264644800 -10800 1 %z} {2279156400 -14400 0 %z} {2296094400 -10800 1 %z} {2310606000 -14400 0 %z} {2327544000 -10800 1 %z} {2342660400 -14400 0 %z} {2358993600 -10800 1 %z} {2374110000 -14400 0 %z} {2390443200 -10800 1 %z} {2405559600 -14400 0 %z} {2422497600 -10800 1 %z} {2437009200 -14400 0 %z} {2453947200 -10800 1 %z} {2468458800 -14400 0 %z} {2485396800 -10800 1 %z} {2500513200 -14400 0 %z} {2516846400 -10800 1 %z} {2531962800 -14400 0 %z} {2548296000 -10800 1 %z} {2563412400 -14400 0 %z} {2579745600 -10800 1 %z} {2594862000 -14400 0 %z} {2611800000 -10800 1 %z} {2626311600 -14400 0 %z} {2643249600 -10800 1 %z} {2657761200 -14400 0 %z} {2674699200 -10800 1 %z} {2689815600 -14400 0 %z} {2706148800 -10800 1 %z} {2721265200 -14400 0 %z} {2737598400 -10800 1 %z} {2752714800 -14400 0 %z} {2769652800 -10800 1 %z} {2784164400 -14400 0 %z} {2801102400 -10800 1 %z} {2815614000 -14400 0 %z} {2832552000 -10800 1 %z} {2847668400 -14400 0 %z} {2864001600 -10800 1 %z} {2879118000 -14400 0 %z} {2895451200 -10800 1 %z} {2910567600 -14400 0 %z} {2926900800 -10800 1 %z} {2942017200 -14400 0 %z} {2958955200 -10800 1 %z} {2973466800 -14400 0 %z} {2990404800 -10800 1 %z} {3004916400 -14400 0 %z} {3021854400 -10800 1 %z} {3036970800 -14400 0 %z} {3053304000 -10800 1 %z} {3068420400 -14400 0 %z} {3084753600 -10800 1 %z} {3099870000 -14400 0 %z} {3116808000 -10800 1 %z} {3131319600 -14400 0 %z} {3148257600 -10800 1 %z} {3162769200 -14400 0 %z} {3179707200 -10800 1 %z} {3194218800 -14400 0 %z} {3211156800 -10800 1 %z} {3226273200 -14400 0 %z} {3242606400 -10800 1 %z} {3257722800 -14400 0 %z} {3274056000 -10800 1 %z} {3289172400 -14400 0 %z} {3306110400 -10800 1 %z} {3320622000 -14400 0 %z} {3337560000 -10800 1 %z} {3352071600 -14400 0 %z} {3369009600 -10800 1 %z} {3384126000 -14400 0 %z} {3400459200 -10800 1 %z} {3415575600 -14400 0 %z} {3431908800 -10800 1 %z} {3447025200 -14400 0 %z} {3463358400 -10800 1 %z} {3478474800 -14400 0 %z} {3495412800 -10800 1 %z} {3509924400 -14400 0 %z} {3526862400 -10800 1 %z} {3541374000 -14400 0 %z} {3558312000 -10800 1 %z} {3573428400 -14400 0 %z} {3589761600 -10800 1 %z} {3604878000 -14400 0 %z} {3621211200 -10800 1 %z} {3636327600 -14400 0 %z} {3653265600 -10800 1 %z} {3667777200 -14400 0 %z} {3684715200 -10800 1 %z} {3699226800 -14400 0 %z} {3716164800 -10800 1 %z} {3731281200 -14400 0 %z} {3747614400 -10800 1 %z} {3762730800 -14400 0 %z} {3779064000 -10800 1 %z} {3794180400 -14400 0 %z} {3810513600 -10800 1 %z} {3825630000 -14400 0 %z} {3842568000 -10800 1 %z} {3857079600 -14400 0 %z} {3874017600 -10800 1 %z} {3888529200 -14400 0 %z} {3905467200 -10800 1 %z} {3920583600 -14400 0 %z} {3936916800 -10800 1 %z} {3952033200 -14400 0 %z} {3968366400 -10800 1 %z} {3983482800 -14400 0 %z} {4000420800 -10800 1 %z} {4014932400 -14400 0 %z} {4031870400 -10800 1 %z} {4046382000 -14400 0 %z} {4063320000 -10800 1 %z} {4077831600 -14400 0 %z} {4094769600 -10800 1 %z} } |
Changes to library/tzdata/America/Bahia.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Bahia) { {-9223372036854775808 -9244 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Bahia) { {-9223372036854775808 -9244 0 LMT} {-1767216356 -10800 0 %z} {-1206957600 -7200 1 %z} {-1191362400 -10800 0 %z} {-1175374800 -7200 1 %z} {-1159826400 -10800 0 %z} {-633819600 -7200 1 %z} {-622069200 -10800 0 %z} {-602283600 -7200 1 %z} {-591832800 -10800 0 %z} {-570747600 -7200 1 %z} {-560210400 -10800 0 %z} {-539125200 -7200 1 %z} {-531352800 -10800 0 %z} {-191365200 -7200 1 %z} {-184197600 -10800 0 %z} {-155163600 -7200 1 %z} {-150069600 -10800 0 %z} {-128898000 -7200 1 %z} {-121125600 -10800 0 %z} {-99954000 -7200 1 %z} {-89589600 -10800 0 %z} {-68418000 -7200 1 %z} {-57967200 -10800 0 %z} {499748400 -7200 1 %z} {511236000 -10800 0 %z} {530593200 -7200 1 %z} {540266400 -10800 0 %z} {562129200 -7200 1 %z} {571197600 -10800 0 %z} {592974000 -7200 1 %z} {602042400 -10800 0 %z} {624423600 -7200 1 %z} {634701600 -10800 0 %z} {656478000 -7200 1 %z} {666756000 -10800 0 %z} {687927600 -7200 1 %z} {697600800 -10800 0 %z} {719982000 -7200 1 %z} {728445600 -10800 0 %z} {750826800 -7200 1 %z} {761709600 -10800 0 %z} {782276400 -7200 1 %z} {793159200 -10800 0 %z} {813726000 -7200 1 %z} {824004000 -10800 0 %z} {844570800 -7200 1 %z} {856058400 -10800 0 %z} {876106800 -7200 1 %z} {888717600 -10800 0 %z} {908074800 -7200 1 %z} {919562400 -10800 0 %z} {938919600 -7200 1 %z} {951616800 -10800 0 %z} {970974000 -7200 1 %z} {982461600 -10800 0 %z} {1003028400 -7200 1 %z} {1013911200 -10800 0 %z} {1036292400 -7200 1 %z} {1045360800 -10800 0 %z} {1064368800 -10800 0 %z} {1318734000 -7200 0 %z} {1330221600 -10800 0 %z} {1350784800 -10800 0 %z} } |
Changes to library/tzdata/America/Bahia_Banderas.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Bahia_Banderas) { {-9223372036854775808 -25260 0 LMT} {-1514739600 -25200 0 MST} | | | < | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Bahia_Banderas) { {-9223372036854775808 -25260 0 LMT} {-1514739600 -25200 0 MST} {-1343149200 -21600 0 CST} {-1234807200 -25200 0 MST} {-1220461200 -21600 1 MDT} {-1207159200 -25200 0 MST} {-1191344400 -21600 0 CST} {-873828000 -25200 0 MST} {25200 -25200 0 MST} {828867600 -21600 1 MDT} {846403200 -25200 0 MST} {860317200 -21600 1 MDT} {877852800 -25200 0 MST} {891766800 -21600 1 MDT} {909302400 -25200 0 MST} {923216400 -21600 1 MDT} |
︙ | ︙ |
Changes to library/tzdata/America/Belem.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Belem) { {-9223372036854775808 -11636 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Belem) { {-9223372036854775808 -11636 0 LMT} {-1767213964 -10800 0 %z} {-1206957600 -7200 1 %z} {-1191362400 -10800 0 %z} {-1175374800 -7200 1 %z} {-1159826400 -10800 0 %z} {-633819600 -7200 1 %z} {-622069200 -10800 0 %z} {-602283600 -7200 1 %z} {-591832800 -10800 0 %z} {-570747600 -7200 1 %z} {-560210400 -10800 0 %z} {-539125200 -7200 1 %z} {-531352800 -10800 0 %z} {-191365200 -7200 1 %z} {-184197600 -10800 0 %z} {-155163600 -7200 1 %z} {-150069600 -10800 0 %z} {-128898000 -7200 1 %z} {-121125600 -10800 0 %z} {-99954000 -7200 1 %z} {-89589600 -10800 0 %z} {-68418000 -7200 1 %z} {-57967200 -10800 0 %z} {499748400 -7200 1 %z} {511236000 -10800 0 %z} {530593200 -7200 1 %z} {540266400 -10800 0 %z} {562129200 -7200 1 %z} {571197600 -10800 0 %z} {590032800 -10800 0 %z} } |
Changes to library/tzdata/America/Boa_Vista.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Boa_Vista) { {-9223372036854775808 -14560 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Boa_Vista) { {-9223372036854775808 -14560 0 LMT} {-1767211040 -14400 0 %z} {-1206954000 -10800 1 %z} {-1191358800 -14400 0 %z} {-1175371200 -10800 1 %z} {-1159822800 -14400 0 %z} {-633816000 -10800 1 %z} {-622065600 -14400 0 %z} {-602280000 -10800 1 %z} {-591829200 -14400 0 %z} {-570744000 -10800 1 %z} {-560206800 -14400 0 %z} {-539121600 -10800 1 %z} {-531349200 -14400 0 %z} {-191361600 -10800 1 %z} {-184194000 -14400 0 %z} {-155160000 -10800 1 %z} {-150066000 -14400 0 %z} {-128894400 -10800 1 %z} {-121122000 -14400 0 %z} {-99950400 -10800 1 %z} {-89586000 -14400 0 %z} {-68414400 -10800 1 %z} {-57963600 -14400 0 %z} {499752000 -10800 1 %z} {511239600 -14400 0 %z} {530596800 -10800 1 %z} {540270000 -14400 0 %z} {562132800 -10800 1 %z} {571201200 -14400 0 %z} {590036400 -14400 0 %z} {938664000 -14400 0 %z} {938923200 -10800 1 %z} {951620400 -14400 0 %z} {970977600 -10800 1 %z} {971578800 -14400 0 %z} } |
Changes to library/tzdata/America/Bogota.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Bogota) { {-9223372036854775808 -17776 0 LMT} {-2707671824 -17776 0 BMT} | | | | | 1 2 3 4 5 6 7 8 9 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Bogota) { {-9223372036854775808 -17776 0 LMT} {-2707671824 -17776 0 BMT} {-1739041424 -18000 0 %z} {704869200 -14400 1 %z} {729057600 -18000 0 %z} } |
Changes to library/tzdata/America/Campo_Grande.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Campo_Grande) { {-9223372036854775808 -13108 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Campo_Grande) { {-9223372036854775808 -13108 0 LMT} {-1767212492 -14400 0 %z} {-1206954000 -10800 1 %z} {-1191358800 -14400 0 %z} {-1175371200 -10800 1 %z} {-1159822800 -14400 0 %z} {-633816000 -10800 1 %z} {-622065600 -14400 0 %z} {-602280000 -10800 1 %z} {-591829200 -14400 0 %z} {-570744000 -10800 1 %z} {-560206800 -14400 0 %z} {-539121600 -10800 1 %z} {-531349200 -14400 0 %z} {-191361600 -10800 1 %z} {-184194000 -14400 0 %z} {-155160000 -10800 1 %z} {-150066000 -14400 0 %z} {-128894400 -10800 1 %z} {-121122000 -14400 0 %z} {-99950400 -10800 1 %z} {-89586000 -14400 0 %z} {-68414400 -10800 1 %z} {-57963600 -14400 0 %z} {499752000 -10800 1 %z} {511239600 -14400 0 %z} {530596800 -10800 1 %z} {540270000 -14400 0 %z} {562132800 -10800 1 %z} {571201200 -14400 0 %z} {592977600 -10800 1 %z} {602046000 -14400 0 %z} {624427200 -10800 1 %z} {634705200 -14400 0 %z} {656481600 -10800 1 %z} {666759600 -14400 0 %z} {687931200 -10800 1 %z} {697604400 -14400 0 %z} {719985600 -10800 1 %z} {728449200 -14400 0 %z} {750830400 -10800 1 %z} {761713200 -14400 0 %z} {782280000 -10800 1 %z} {793162800 -14400 0 %z} {813729600 -10800 1 %z} {824007600 -14400 0 %z} {844574400 -10800 1 %z} {856062000 -14400 0 %z} {876110400 -10800 1 %z} {888721200 -14400 0 %z} {908078400 -10800 1 %z} {919566000 -14400 0 %z} {938923200 -10800 1 %z} {951620400 -14400 0 %z} {970977600 -10800 1 %z} {982465200 -14400 0 %z} {1003032000 -10800 1 %z} {1013914800 -14400 0 %z} {1036296000 -10800 1 %z} {1045364400 -14400 0 %z} {1066536000 -10800 1 %z} {1076814000 -14400 0 %z} {1099368000 -10800 1 %z} {1108868400 -14400 0 %z} {1129435200 -10800 1 %z} {1140318000 -14400 0 %z} {1162699200 -10800 1 %z} {1172372400 -14400 0 %z} {1192334400 -10800 1 %z} {1203217200 -14400 0 %z} {1224388800 -10800 1 %z} {1234666800 -14400 0 %z} {1255838400 -10800 1 %z} {1266721200 -14400 0 %z} {1287288000 -10800 1 %z} {1298170800 -14400 0 %z} {1318737600 -10800 1 %z} {1330225200 -14400 0 %z} {1350792000 -10800 1 %z} {1361070000 -14400 0 %z} {1382241600 -10800 1 %z} {1392519600 -14400 0 %z} {1413691200 -10800 1 %z} {1424574000 -14400 0 %z} {1445140800 -10800 1 %z} {1456023600 -14400 0 %z} {1476590400 -10800 1 %z} {1487473200 -14400 0 %z} {1508040000 -10800 1 %z} {1518922800 -14400 0 %z} {1541304000 -10800 1 %z} {1550372400 -14400 0 %z} } |
Changes to library/tzdata/America/Cancun.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Cancun) { {-9223372036854775808 -20824 0 LMT} {-1514743200 -21600 0 CST} | | | | > | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Cancun) { {-9223372036854775808 -20824 0 LMT} {-1514743200 -21600 0 CST} {378201600 -18000 0 EST} {410504400 -21600 0 CST} {828864000 -18000 1 CDT} {846399600 -21600 0 CST} {860313600 -18000 1 CDT} {877852800 -18000 0 EST} {891759600 -14400 1 EDT} {902041200 -18000 0 CDT} {909298800 -21600 0 CST} {923212800 -18000 1 CDT} {941353200 -21600 0 CST} {954662400 -18000 1 CDT} {972802800 -21600 0 CST} |
︙ | ︙ |
Changes to library/tzdata/America/Caracas.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Caracas) { {-9223372036854775808 -16064 0 LMT} {-2524505536 -16060 0 CMT} | | | | | | 1 2 3 4 5 6 7 8 9 10 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Caracas) { {-9223372036854775808 -16064 0 LMT} {-2524505536 -16060 0 CMT} {-1826739140 -16200 0 %z} {-157750200 -14400 0 %z} {1197183600 -16200 0 %z} {1462086000 -14400 0 %z} } |
Changes to library/tzdata/America/Cayenne.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Cayenne) { {-9223372036854775808 -12560 0 LMT} | | | | 1 2 3 4 5 6 7 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Cayenne) { {-9223372036854775808 -12560 0 LMT} {-1846269040 -14400 0 %z} {-71092800 -10800 0 %z} } |
Changes to library/tzdata/America/Chihuahua.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Chihuahua) { {-9223372036854775808 -25460 0 LMT} {-1514739600 -25200 0 MST} | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Chihuahua) { {-9223372036854775808 -25460 0 LMT} {-1514739600 -25200 0 MST} {-1343149200 -21600 0 CST} {-1234807200 -25200 0 MST} {-1220461200 -21600 1 MDT} {-1207159200 -25200 0 MST} {-1191344400 -21600 0 CST} {820476000 -21600 0 CST} {828864000 -18000 1 CDT} {846399600 -21600 0 CST} {860313600 -18000 1 CDT} {877849200 -21600 0 CST} |
︙ | ︙ |
Changes to library/tzdata/America/Ciudad_Juarez.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Ciudad_Juarez) { {-9223372036854775808 -25556 0 LMT} {-1514739600 -25200 0 MST} | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Ciudad_Juarez) { {-9223372036854775808 -25556 0 LMT} {-1514739600 -25200 0 MST} {-1343149200 -21600 0 CST} {-1234807200 -25200 0 MST} {-1220461200 -21600 1 MDT} {-1207159200 -25200 0 MST} {-1191344400 -21600 0 CST} {820476000 -21600 0 CST} {828864000 -18000 1 CDT} {846399600 -21600 0 CST} {860313600 -18000 1 CDT} {877849200 -21600 0 CST} |
︙ | ︙ |
Changes to library/tzdata/America/Cuiaba.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Cuiaba) { {-9223372036854775808 -13460 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Cuiaba) { {-9223372036854775808 -13460 0 LMT} {-1767212140 -14400 0 %z} {-1206954000 -10800 1 %z} {-1191358800 -14400 0 %z} {-1175371200 -10800 1 %z} {-1159822800 -14400 0 %z} {-633816000 -10800 1 %z} {-622065600 -14400 0 %z} {-602280000 -10800 1 %z} {-591829200 -14400 0 %z} {-570744000 -10800 1 %z} {-560206800 -14400 0 %z} {-539121600 -10800 1 %z} {-531349200 -14400 0 %z} {-191361600 -10800 1 %z} {-184194000 -14400 0 %z} {-155160000 -10800 1 %z} {-150066000 -14400 0 %z} {-128894400 -10800 1 %z} {-121122000 -14400 0 %z} {-99950400 -10800 1 %z} {-89586000 -14400 0 %z} {-68414400 -10800 1 %z} {-57963600 -14400 0 %z} {499752000 -10800 1 %z} {511239600 -14400 0 %z} {530596800 -10800 1 %z} {540270000 -14400 0 %z} {562132800 -10800 1 %z} {571201200 -14400 0 %z} {592977600 -10800 1 %z} {602046000 -14400 0 %z} {624427200 -10800 1 %z} {634705200 -14400 0 %z} {656481600 -10800 1 %z} {666759600 -14400 0 %z} {687931200 -10800 1 %z} {697604400 -14400 0 %z} {719985600 -10800 1 %z} {728449200 -14400 0 %z} {750830400 -10800 1 %z} {761713200 -14400 0 %z} {782280000 -10800 1 %z} {793162800 -14400 0 %z} {813729600 -10800 1 %z} {824007600 -14400 0 %z} {844574400 -10800 1 %z} {856062000 -14400 0 %z} {876110400 -10800 1 %z} {888721200 -14400 0 %z} {908078400 -10800 1 %z} {919566000 -14400 0 %z} {938923200 -10800 1 %z} {951620400 -14400 0 %z} {970977600 -10800 1 %z} {982465200 -14400 0 %z} {1003032000 -10800 1 %z} {1013914800 -14400 0 %z} {1036296000 -10800 1 %z} {1045364400 -14400 0 %z} {1064372400 -14400 0 %z} {1096603200 -14400 0 %z} {1099368000 -10800 1 %z} {1108868400 -14400 0 %z} {1129435200 -10800 1 %z} {1140318000 -14400 0 %z} {1162699200 -10800 1 %z} {1172372400 -14400 0 %z} {1192334400 -10800 1 %z} {1203217200 -14400 0 %z} {1224388800 -10800 1 %z} {1234666800 -14400 0 %z} {1255838400 -10800 1 %z} {1266721200 -14400 0 %z} {1287288000 -10800 1 %z} {1298170800 -14400 0 %z} {1318737600 -10800 1 %z} {1330225200 -14400 0 %z} {1350792000 -10800 1 %z} {1361070000 -14400 0 %z} {1382241600 -10800 1 %z} {1392519600 -14400 0 %z} {1413691200 -10800 1 %z} {1424574000 -14400 0 %z} {1445140800 -10800 1 %z} {1456023600 -14400 0 %z} {1476590400 -10800 1 %z} {1487473200 -14400 0 %z} {1508040000 -10800 1 %z} {1518922800 -14400 0 %z} {1541304000 -10800 1 %z} {1550372400 -14400 0 %z} } |
Changes to library/tzdata/America/Danmarkshavn.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Danmarkshavn) { {-9223372036854775808 -4480 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Danmarkshavn) { {-9223372036854775808 -4480 0 LMT} {-1686091520 -10800 0 %z} {323845200 -7200 0 %z} {338950800 -10800 0 %z} {354675600 -7200 1 %z} {370400400 -10800 0 %z} {386125200 -7200 1 %z} {401850000 -10800 0 %z} {417574800 -7200 1 %z} {433299600 -10800 0 %z} {449024400 -7200 1 %z} {465354000 -10800 0 %z} {481078800 -7200 1 %z} {496803600 -10800 0 %z} {512528400 -7200 1 %z} {528253200 -10800 0 %z} {543978000 -7200 1 %z} {559702800 -10800 0 %z} {575427600 -7200 1 %z} {591152400 -10800 0 %z} {606877200 -7200 1 %z} {622602000 -10800 0 %z} {638326800 -7200 1 %z} {654656400 -10800 0 %z} {670381200 -7200 1 %z} {686106000 -10800 0 %z} {701830800 -7200 1 %z} {717555600 -10800 0 %z} {733280400 -7200 1 %z} {749005200 -10800 0 %z} {764730000 -7200 1 %z} {780454800 -10800 0 %z} {796179600 -7200 1 %z} {811904400 -10800 0 %z} {820465200 0 0 GMT} } |
Changes to library/tzdata/America/Eirunepe.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Eirunepe) { {-9223372036854775808 -16768 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Eirunepe) { {-9223372036854775808 -16768 0 LMT} {-1767208832 -18000 0 %z} {-1206950400 -14400 1 %z} {-1191355200 -18000 0 %z} {-1175367600 -14400 1 %z} {-1159819200 -18000 0 %z} {-633812400 -14400 1 %z} {-622062000 -18000 0 %z} {-602276400 -14400 1 %z} {-591825600 -18000 0 %z} {-570740400 -14400 1 %z} {-560203200 -18000 0 %z} {-539118000 -14400 1 %z} {-531345600 -18000 0 %z} {-191358000 -14400 1 %z} {-184190400 -18000 0 %z} {-155156400 -14400 1 %z} {-150062400 -18000 0 %z} {-128890800 -14400 1 %z} {-121118400 -18000 0 %z} {-99946800 -14400 1 %z} {-89582400 -18000 0 %z} {-68410800 -14400 1 %z} {-57960000 -18000 0 %z} {499755600 -14400 1 %z} {511243200 -18000 0 %z} {530600400 -14400 1 %z} {540273600 -18000 0 %z} {562136400 -14400 1 %z} {571204800 -18000 0 %z} {590040000 -18000 0 %z} {749192400 -18000 0 %z} {750834000 -14400 1 %z} {761716800 -18000 0 %z} {780206400 -18000 0 %z} {1214283600 -14400 0 %z} {1384056000 -18000 0 %z} } |
Changes to library/tzdata/America/Fortaleza.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Fortaleza) { {-9223372036854775808 -9240 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Fortaleza) { {-9223372036854775808 -9240 0 LMT} {-1767216360 -10800 0 %z} {-1206957600 -7200 1 %z} {-1191362400 -10800 0 %z} {-1175374800 -7200 1 %z} {-1159826400 -10800 0 %z} {-633819600 -7200 1 %z} {-622069200 -10800 0 %z} {-602283600 -7200 1 %z} {-591832800 -10800 0 %z} {-570747600 -7200 1 %z} {-560210400 -10800 0 %z} {-539125200 -7200 1 %z} {-531352800 -10800 0 %z} {-191365200 -7200 1 %z} {-184197600 -10800 0 %z} {-155163600 -7200 1 %z} {-150069600 -10800 0 %z} {-128898000 -7200 1 %z} {-121125600 -10800 0 %z} {-99954000 -7200 1 %z} {-89589600 -10800 0 %z} {-68418000 -7200 1 %z} {-57967200 -10800 0 %z} {499748400 -7200 1 %z} {511236000 -10800 0 %z} {530593200 -7200 1 %z} {540266400 -10800 0 %z} {562129200 -7200 1 %z} {571197600 -10800 0 %z} {592974000 -7200 1 %z} {602042400 -10800 0 %z} {624423600 -7200 1 %z} {634701600 -10800 0 %z} {653536800 -10800 0 %z} {938660400 -10800 0 %z} {938919600 -7200 1 %z} {951616800 -10800 0 %z} {970974000 -7200 1 %z} {972180000 -10800 0 %z} {1000350000 -10800 0 %z} {1003028400 -7200 1 %z} {1013911200 -10800 0 %z} {1033437600 -10800 0 %z} } |
Changes to library/tzdata/America/Guayaquil.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Guayaquil) { {-9223372036854775808 -19160 0 LMT} {-2524502440 -18840 0 QMT} | | | | | 1 2 3 4 5 6 7 8 9 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Guayaquil) { {-9223372036854775808 -19160 0 LMT} {-2524502440 -18840 0 QMT} {-1230749160 -18000 0 %z} {722926800 -14400 1 %z} {728884800 -18000 0 %z} } |
Changes to library/tzdata/America/Guyana.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Guyana) { {-9223372036854775808 -13959 0 LMT} | | | | | | 1 2 3 4 5 6 7 8 9 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Guyana) { {-9223372036854775808 -13959 0 LMT} {-1843589241 -14400 0 %z} {-1730577600 -13500 0 %z} {176096700 -10800 0 %z} {701841600 -14400 0 %z} } |
Changes to library/tzdata/America/Hermosillo.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Hermosillo) { {-9223372036854775808 -26632 0 LMT} {-1514739600 -25200 0 MST} | | | < | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Hermosillo) { {-9223372036854775808 -26632 0 LMT} {-1514739600 -25200 0 MST} {-1343149200 -21600 0 CST} {-1234807200 -25200 0 MST} {-1220461200 -21600 1 MDT} {-1207159200 -25200 0 MST} {-1191344400 -21600 0 CST} {-873828000 -25200 0 MST} {820479600 -25200 0 MST} {828867600 -21600 1 MDT} {846403200 -25200 0 MST} {860317200 -21600 1 MDT} {877852800 -25200 0 MST} {891766800 -21600 1 MDT} {909302400 -25200 0 MST} {915174000 -25200 0 MST} |
︙ | ︙ |
Changes to library/tzdata/America/La_Paz.
1 2 3 4 5 6 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/La_Paz) { {-9223372036854775808 -16356 0 LMT} {-2524505244 -16356 0 CMT} {-1205954844 -12756 1 BST} | | | 1 2 3 4 5 6 7 8 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/La_Paz) { {-9223372036854775808 -16356 0 LMT} {-2524505244 -16356 0 CMT} {-1205954844 -12756 1 BST} {-1192307244 -14400 0 %z} } |
Changes to library/tzdata/America/Lima.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Lima) { {-9223372036854775808 -18492 0 LMT} {-2524503108 -18516 0 LMT} | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Lima) { {-9223372036854775808 -18492 0 LMT} {-2524503108 -18516 0 LMT} {-1938538284 -14400 0 %z} {-1002052800 -18000 0 %z} {-986756400 -14400 1 %z} {-971035200 -18000 0 %z} {-955306800 -14400 1 %z} {-939585600 -18000 0 %z} {512712000 -18000 0 %z} {544248000 -18000 0 %z} {638942400 -18000 0 %z} {765172800 -18000 0 %z} } |
Changes to library/tzdata/America/Maceio.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Maceio) { {-9223372036854775808 -8572 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Maceio) { {-9223372036854775808 -8572 0 LMT} {-1767217028 -10800 0 %z} {-1206957600 -7200 1 %z} {-1191362400 -10800 0 %z} {-1175374800 -7200 1 %z} {-1159826400 -10800 0 %z} {-633819600 -7200 1 %z} {-622069200 -10800 0 %z} {-602283600 -7200 1 %z} {-591832800 -10800 0 %z} {-570747600 -7200 1 %z} {-560210400 -10800 0 %z} {-539125200 -7200 1 %z} {-531352800 -10800 0 %z} {-191365200 -7200 1 %z} {-184197600 -10800 0 %z} {-155163600 -7200 1 %z} {-150069600 -10800 0 %z} {-128898000 -7200 1 %z} {-121125600 -10800 0 %z} {-99954000 -7200 1 %z} {-89589600 -10800 0 %z} {-68418000 -7200 1 %z} {-57967200 -10800 0 %z} {499748400 -7200 1 %z} {511236000 -10800 0 %z} {530593200 -7200 1 %z} {540266400 -10800 0 %z} {562129200 -7200 1 %z} {571197600 -10800 0 %z} {592974000 -7200 1 %z} {602042400 -10800 0 %z} {624423600 -7200 1 %z} {634701600 -10800 0 %z} {653536800 -10800 0 %z} {813553200 -10800 0 %z} {813726000 -7200 1 %z} {824004000 -10800 0 %z} {841802400 -10800 0 %z} {938660400 -10800 0 %z} {938919600 -7200 1 %z} {951616800 -10800 0 %z} {970974000 -7200 1 %z} {972180000 -10800 0 %z} {1000350000 -10800 0 %z} {1003028400 -7200 1 %z} {1013911200 -10800 0 %z} {1033437600 -10800 0 %z} } |
Changes to library/tzdata/America/Manaus.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Manaus) { {-9223372036854775808 -14404 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Manaus) { {-9223372036854775808 -14404 0 LMT} {-1767211196 -14400 0 %z} {-1206954000 -10800 1 %z} {-1191358800 -14400 0 %z} {-1175371200 -10800 1 %z} {-1159822800 -14400 0 %z} {-633816000 -10800 1 %z} {-622065600 -14400 0 %z} {-602280000 -10800 1 %z} {-591829200 -14400 0 %z} {-570744000 -10800 1 %z} {-560206800 -14400 0 %z} {-539121600 -10800 1 %z} {-531349200 -14400 0 %z} {-191361600 -10800 1 %z} {-184194000 -14400 0 %z} {-155160000 -10800 1 %z} {-150066000 -14400 0 %z} {-128894400 -10800 1 %z} {-121122000 -14400 0 %z} {-99950400 -10800 1 %z} {-89586000 -14400 0 %z} {-68414400 -10800 1 %z} {-57963600 -14400 0 %z} {499752000 -10800 1 %z} {511239600 -14400 0 %z} {530596800 -10800 1 %z} {540270000 -14400 0 %z} {562132800 -10800 1 %z} {571201200 -14400 0 %z} {590036400 -14400 0 %z} {749188800 -14400 0 %z} {750830400 -10800 1 %z} {761713200 -14400 0 %z} {780202800 -14400 0 %z} } |
Changes to library/tzdata/America/Mazatlan.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Mazatlan) { {-9223372036854775808 -25540 0 LMT} {-1514739600 -25200 0 MST} | | | < | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Mazatlan) { {-9223372036854775808 -25540 0 LMT} {-1514739600 -25200 0 MST} {-1343149200 -21600 0 CST} {-1234807200 -25200 0 MST} {-1220461200 -21600 1 MDT} {-1207159200 -25200 0 MST} {-1191344400 -21600 0 CST} {-873828000 -25200 0 MST} {25200 -25200 0 MST} {828867600 -21600 1 MDT} {846403200 -25200 0 MST} {860317200 -21600 1 MDT} {877852800 -25200 0 MST} {891766800 -21600 1 MDT} {909302400 -25200 0 MST} {923216400 -21600 1 MDT} |
︙ | ︙ |
Changes to library/tzdata/America/Merida.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Merida) { {-9223372036854775808 -21508 0 LMT} {-1514743200 -21600 0 CST} | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Merida) { {-9223372036854775808 -21508 0 LMT} {-1514743200 -21600 0 CST} {378201600 -18000 0 EST} {405068400 -21600 0 CST} {828864000 -18000 1 CDT} {846399600 -21600 0 CST} {860313600 -18000 1 CDT} {877849200 -21600 0 CST} {891763200 -18000 1 CDT} {909298800 -21600 0 CST} {923212800 -18000 1 CDT} |
︙ | ︙ |
Changes to library/tzdata/America/Mexico_City.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Mexico_City) { {-9223372036854775808 -23796 0 LMT} {-1514739600 -25200 0 MST} | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Mexico_City) { {-9223372036854775808 -23796 0 LMT} {-1514739600 -25200 0 MST} {-1343149200 -21600 0 CST} {-1234807200 -25200 0 MST} {-1220461200 -21600 1 MDT} {-1207159200 -25200 0 MST} {-1191344400 -21600 0 CST} {-975261600 -18000 1 CDT} {-963169200 -21600 0 CST} {-917114400 -18000 1 CDT} {-907354800 -21600 0 CST} {-821901600 -18000 1 CWT} |
︙ | ︙ |
Changes to library/tzdata/America/Miquelon.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Miquelon) { {-9223372036854775808 -13480 0 LMT} {-1847650520 -14400 0 AST} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Miquelon) { {-9223372036854775808 -13480 0 LMT} {-1847650520 -14400 0 AST} {326001600 -10800 0 %z} {536468400 -10800 0 %z} {544597200 -7200 1 %z} {562132800 -10800 0 %z} {576046800 -7200 1 %z} {594187200 -10800 0 %z} {607496400 -7200 1 %z} {625636800 -10800 0 %z} {638946000 -7200 1 %z} {657086400 -10800 0 %z} {671000400 -7200 1 %z} {688536000 -10800 0 %z} {702450000 -7200 1 %z} {719985600 -10800 0 %z} {733899600 -7200 1 %z} {752040000 -10800 0 %z} {765349200 -7200 1 %z} {783489600 -10800 0 %z} {796798800 -7200 1 %z} {814939200 -10800 0 %z} {828853200 -7200 1 %z} {846388800 -10800 0 %z} {860302800 -7200 1 %z} {877838400 -10800 0 %z} {891752400 -7200 1 %z} {909288000 -10800 0 %z} {923202000 -7200 1 %z} {941342400 -10800 0 %z} {954651600 -7200 1 %z} {972792000 -10800 0 %z} {986101200 -7200 1 %z} {1004241600 -10800 0 %z} {1018155600 -7200 1 %z} {1035691200 -10800 0 %z} {1049605200 -7200 1 %z} {1067140800 -10800 0 %z} {1081054800 -7200 1 %z} {1099195200 -10800 0 %z} {1112504400 -7200 1 %z} {1130644800 -10800 0 %z} {1143954000 -7200 1 %z} {1162094400 -10800 0 %z} {1173589200 -7200 1 %z} {1194148800 -10800 0 %z} {1205038800 -7200 1 %z} {1225598400 -10800 0 %z} {1236488400 -7200 1 %z} {1257048000 -10800 0 %z} {1268542800 -7200 1 %z} {1289102400 -10800 0 %z} {1299992400 -7200 1 %z} {1320552000 -10800 0 %z} {1331442000 -7200 1 %z} {1352001600 -10800 0 %z} {1362891600 -7200 1 %z} {1383451200 -10800 0 %z} {1394341200 -7200 1 %z} {1414900800 -10800 0 %z} {1425790800 -7200 1 %z} {1446350400 -10800 0 %z} {1457845200 -7200 1 %z} {1478404800 -10800 0 %z} {1489294800 -7200 1 %z} {1509854400 -10800 0 %z} {1520744400 -7200 1 %z} {1541304000 -10800 0 %z} {1552194000 -7200 1 %z} {1572753600 -10800 0 %z} {1583643600 -7200 1 %z} {1604203200 -10800 0 %z} {1615698000 -7200 1 %z} {1636257600 -10800 0 %z} {1647147600 -7200 1 %z} {1667707200 -10800 0 %z} {1678597200 -7200 1 %z} {1699156800 -10800 0 %z} {1710046800 -7200 1 %z} {1730606400 -10800 0 %z} {1741496400 -7200 1 %z} {1762056000 -10800 0 %z} {1772946000 -7200 1 %z} {1793505600 -10800 0 %z} {1805000400 -7200 1 %z} {1825560000 -10800 0 %z} {1836450000 -7200 1 %z} {1857009600 -10800 0 %z} {1867899600 -7200 1 %z} {1888459200 -10800 0 %z} {1899349200 -7200 1 %z} {1919908800 -10800 0 %z} {1930798800 -7200 1 %z} {1951358400 -10800 0 %z} {1962853200 -7200 1 %z} {1983412800 -10800 0 %z} {1994302800 -7200 1 %z} {2014862400 -10800 0 %z} {2025752400 -7200 1 %z} {2046312000 -10800 0 %z} {2057202000 -7200 1 %z} {2077761600 -10800 0 %z} {2088651600 -7200 1 %z} {2109211200 -10800 0 %z} {2120101200 -7200 1 %z} {2140660800 -10800 0 %z} {2152155600 -7200 1 %z} {2172715200 -10800 0 %z} {2183605200 -7200 1 %z} {2204164800 -10800 0 %z} {2215054800 -7200 1 %z} {2235614400 -10800 0 %z} {2246504400 -7200 1 %z} {2267064000 -10800 0 %z} {2277954000 -7200 1 %z} {2298513600 -10800 0 %z} {2309403600 -7200 1 %z} {2329963200 -10800 0 %z} {2341458000 -7200 1 %z} {2362017600 -10800 0 %z} {2372907600 -7200 1 %z} {2393467200 -10800 0 %z} {2404357200 -7200 1 %z} {2424916800 -10800 0 %z} {2435806800 -7200 1 %z} {2456366400 -10800 0 %z} {2467256400 -7200 1 %z} {2487816000 -10800 0 %z} {2499310800 -7200 1 %z} {2519870400 -10800 0 %z} {2530760400 -7200 1 %z} {2551320000 -10800 0 %z} {2562210000 -7200 1 %z} {2582769600 -10800 0 %z} {2593659600 -7200 1 %z} {2614219200 -10800 0 %z} {2625109200 -7200 1 %z} {2645668800 -10800 0 %z} {2656558800 -7200 1 %z} {2677118400 -10800 0 %z} {2688613200 -7200 1 %z} {2709172800 -10800 0 %z} {2720062800 -7200 1 %z} {2740622400 -10800 0 %z} {2751512400 -7200 1 %z} {2772072000 -10800 0 %z} {2782962000 -7200 1 %z} {2803521600 -10800 0 %z} {2814411600 -7200 1 %z} {2834971200 -10800 0 %z} {2846466000 -7200 1 %z} {2867025600 -10800 0 %z} {2877915600 -7200 1 %z} {2898475200 -10800 0 %z} {2909365200 -7200 1 %z} {2929924800 -10800 0 %z} {2940814800 -7200 1 %z} {2961374400 -10800 0 %z} {2972264400 -7200 1 %z} {2992824000 -10800 0 %z} {3003714000 -7200 1 %z} {3024273600 -10800 0 %z} {3035768400 -7200 1 %z} {3056328000 -10800 0 %z} {3067218000 -7200 1 %z} {3087777600 -10800 0 %z} {3098667600 -7200 1 %z} {3119227200 -10800 0 %z} {3130117200 -7200 1 %z} {3150676800 -10800 0 %z} {3161566800 -7200 1 %z} {3182126400 -10800 0 %z} {3193016400 -7200 1 %z} {3213576000 -10800 0 %z} {3225070800 -7200 1 %z} {3245630400 -10800 0 %z} {3256520400 -7200 1 %z} {3277080000 -10800 0 %z} {3287970000 -7200 1 %z} {3308529600 -10800 0 %z} {3319419600 -7200 1 %z} {3339979200 -10800 0 %z} {3350869200 -7200 1 %z} {3371428800 -10800 0 %z} {3382923600 -7200 1 %z} {3403483200 -10800 0 %z} {3414373200 -7200 1 %z} {3434932800 -10800 0 %z} {3445822800 -7200 1 %z} {3466382400 -10800 0 %z} {3477272400 -7200 1 %z} {3497832000 -10800 0 %z} {3508722000 -7200 1 %z} {3529281600 -10800 0 %z} {3540171600 -7200 1 %z} {3560731200 -10800 0 %z} {3572226000 -7200 1 %z} {3592785600 -10800 0 %z} {3603675600 -7200 1 %z} {3624235200 -10800 0 %z} {3635125200 -7200 1 %z} {3655684800 -10800 0 %z} {3666574800 -7200 1 %z} {3687134400 -10800 0 %z} {3698024400 -7200 1 %z} {3718584000 -10800 0 %z} {3730078800 -7200 1 %z} {3750638400 -10800 0 %z} {3761528400 -7200 1 %z} {3782088000 -10800 0 %z} {3792978000 -7200 1 %z} {3813537600 -10800 0 %z} {3824427600 -7200 1 %z} {3844987200 -10800 0 %z} {3855877200 -7200 1 %z} {3876436800 -10800 0 %z} {3887326800 -7200 1 %z} {3907886400 -10800 0 %z} {3919381200 -7200 1 %z} {3939940800 -10800 0 %z} {3950830800 -7200 1 %z} {3971390400 -10800 0 %z} {3982280400 -7200 1 %z} {4002840000 -10800 0 %z} {4013730000 -7200 1 %z} {4034289600 -10800 0 %z} {4045179600 -7200 1 %z} {4065739200 -10800 0 %z} {4076629200 -7200 1 %z} {4097188800 -10800 0 %z} } |
Changes to library/tzdata/America/Monterrey.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Monterrey) { {-9223372036854775808 -24076 0 LMT} | | > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Monterrey) { {-9223372036854775808 -24076 0 LMT} {-1514743200 -25200 0 MST} {-1343149200 -21600 0 CST} {-1234807200 -25200 0 MST} {-1220461200 -21600 1 MDT} {-1207159200 -25200 0 MST} {-1191344400 -21600 0 CST} {568015200 -21600 0 CST} {576057600 -18000 1 CDT} {594198000 -21600 0 CST} {599637600 -21600 0 CST} {828864000 -18000 1 CDT} {846399600 -21600 0 CST} {860313600 -18000 1 CDT} |
︙ | ︙ |
Changes to library/tzdata/America/Montevideo.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Montevideo) { {-9223372036854775808 -13491 0 LMT} {-1942690509 -13491 0 MMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Montevideo) { {-9223372036854775808 -13491 0 LMT} {-1942690509 -13491 0 MMT} {-1567455309 -14400 0 %z} {-1459627200 -10800 0 %z} {-1443819600 -12600 0 %z} {-1428006600 -10800 1 %z} {-1412283600 -12600 0 %z} {-1396470600 -10800 1 %z} {-1380747600 -12600 0 %z} {-1141590600 -10800 1 %z} {-1128286800 -12600 0 %z} {-1110141000 -10800 1 %z} {-1096837200 -12600 0 %z} {-1078691400 -10800 1 %z} {-1065387600 -12600 0 %z} {-1047241800 -10800 1 %z} {-1033938000 -12600 0 %z} {-1015187400 -10800 1 %z} {-1002488400 -12600 0 %z} {-983737800 -10800 1 %z} {-971038800 -12600 0 %z} {-954707400 -10800 1 %z} {-938984400 -12600 0 %z} {-920838600 -10800 1 %z} {-907534800 -12600 0 %z} {-896819400 -10800 1 %z} {-853621200 -9000 0 %z} {-845847000 -10800 0 %z} {-334789200 -9000 1 %z} {-319671000 -10800 0 %z} {-315608400 -10800 0 %z} {-314226000 -7200 1 %z} {-309996000 -10800 0 %z} {-149720400 -7200 1 %z} {-134604000 -10800 0 %z} {-63147600 -10800 0 %z} {-50446800 -9000 1 %z} {-34205400 -10800 0 %z} {10800 -10800 0 %z} {9860400 -7200 1 %z} {14176800 -10800 0 %z} {72846000 -7200 1 %z} {80100000 -10800 0 %z} {126241200 -10800 0 %z} {127278000 -5400 1 %z} {132112800 -9000 0 %z} {147234600 -10800 0 %z} {156909600 -10800 0 %z} {156913200 -7200 1 %z} {165376800 -10800 0 %z} {219812400 -7200 1 %z} {226461600 -10800 0 %z} {250052400 -7200 1 %z} {257911200 -10800 0 %z} {282711600 -7200 1 %z} {289360800 -10800 0 %z} {294202800 -7200 1 %z} {322020000 -10800 0 %z} {566449200 -7200 1 %z} {573012000 -10800 0 %z} {597812400 -7200 1 %z} {605066400 -10800 0 %z} {625633200 -7200 1 %z} {635911200 -10800 0 %z} {656478000 -7200 1 %z} {667965600 -10800 0 %z} {688532400 -7200 1 %z} {699415200 -10800 0 %z} {719377200 -7200 1 %z} {730864800 -10800 0 %z} {1095562800 -7200 1 %z} {1111896000 -10800 0 %z} {1128834000 -7200 1 %z} {1142136000 -10800 0 %z} {1159678800 -7200 1 %z} {1173585600 -10800 0 %z} {1191733200 -7200 1 %z} {1205035200 -10800 0 %z} {1223182800 -7200 1 %z} {1236484800 -10800 0 %z} {1254632400 -7200 1 %z} {1268539200 -10800 0 %z} {1286082000 -7200 1 %z} {1299988800 -10800 0 %z} {1317531600 -7200 1 %z} {1331438400 -10800 0 %z} {1349586000 -7200 1 %z} {1362888000 -10800 0 %z} {1381035600 -7200 1 %z} {1394337600 -10800 0 %z} {1412485200 -7200 1 %z} {1425787200 -10800 0 %z} } |
Changes to library/tzdata/America/Noronha.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Noronha) { {-9223372036854775808 -7780 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Noronha) { {-9223372036854775808 -7780 0 LMT} {-1767217820 -7200 0 %z} {-1206961200 -3600 1 %z} {-1191366000 -7200 0 %z} {-1175378400 -3600 1 %z} {-1159830000 -7200 0 %z} {-633823200 -3600 1 %z} {-622072800 -7200 0 %z} {-602287200 -3600 1 %z} {-591836400 -7200 0 %z} {-570751200 -3600 1 %z} {-560214000 -7200 0 %z} {-539128800 -3600 1 %z} {-531356400 -7200 0 %z} {-191368800 -3600 1 %z} {-184201200 -7200 0 %z} {-155167200 -3600 1 %z} {-150073200 -7200 0 %z} {-128901600 -3600 1 %z} {-121129200 -7200 0 %z} {-99957600 -3600 1 %z} {-89593200 -7200 0 %z} {-68421600 -3600 1 %z} {-57970800 -7200 0 %z} {499744800 -3600 1 %z} {511232400 -7200 0 %z} {530589600 -3600 1 %z} {540262800 -7200 0 %z} {562125600 -3600 1 %z} {571194000 -7200 0 %z} {592970400 -3600 1 %z} {602038800 -7200 0 %z} {624420000 -3600 1 %z} {634698000 -7200 0 %z} {653533200 -7200 0 %z} {938656800 -7200 0 %z} {938916000 -3600 1 %z} {951613200 -7200 0 %z} {970970400 -3600 1 %z} {971571600 -7200 0 %z} {1000346400 -7200 0 %z} {1003024800 -3600 1 %z} {1013907600 -7200 0 %z} {1033434000 -7200 0 %z} } |
Changes to library/tzdata/America/Nuuk.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Nuuk) { {-9223372036854775808 -12416 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Nuuk) { {-9223372036854775808 -12416 0 LMT} {-1686083584 -10800 0 %z} {323845200 -7200 0 %z} {338950800 -10800 0 %z} {354675600 -7200 1 %z} {370400400 -10800 0 %z} {386125200 -7200 1 %z} {401850000 -10800 0 %z} {417574800 -7200 1 %z} {433299600 -10800 0 %z} {449024400 -7200 1 %z} {465354000 -10800 0 %z} {481078800 -7200 1 %z} {496803600 -10800 0 %z} {512528400 -7200 1 %z} {528253200 -10800 0 %z} {543978000 -7200 1 %z} {559702800 -10800 0 %z} {575427600 -7200 1 %z} {591152400 -10800 0 %z} {606877200 -7200 1 %z} {622602000 -10800 0 %z} {638326800 -7200 1 %z} {654656400 -10800 0 %z} {670381200 -7200 1 %z} {686106000 -10800 0 %z} {701830800 -7200 1 %z} {717555600 -10800 0 %z} {733280400 -7200 1 %z} {749005200 -10800 0 %z} {764730000 -7200 1 %z} {780454800 -10800 0 %z} {796179600 -7200 1 %z} {811904400 -10800 0 %z} {828234000 -7200 1 %z} {846378000 -10800 0 %z} {859683600 -7200 1 %z} {877827600 -10800 0 %z} {891133200 -7200 1 %z} {909277200 -10800 0 %z} {922582800 -7200 1 %z} {941331600 -10800 0 %z} {954032400 -7200 1 %z} {972781200 -10800 0 %z} {985482000 -7200 1 %z} {1004230800 -10800 0 %z} {1017536400 -7200 1 %z} {1035680400 -10800 0 %z} {1048986000 -7200 1 %z} {1067130000 -10800 0 %z} {1080435600 -7200 1 %z} {1099184400 -10800 0 %z} {1111885200 -7200 1 %z} {1130634000 -10800 0 %z} {1143334800 -7200 1 %z} {1162083600 -10800 0 %z} {1174784400 -7200 1 %z} {1193533200 -10800 0 %z} {1206838800 -7200 1 %z} {1224982800 -10800 0 %z} {1238288400 -7200 1 %z} {1256432400 -10800 0 %z} {1269738000 -7200 1 %z} {1288486800 -10800 0 %z} {1301187600 -7200 1 %z} {1319936400 -10800 0 %z} {1332637200 -7200 1 %z} {1351386000 -10800 0 %z} {1364691600 -7200 1 %z} {1382835600 -10800 0 %z} {1396141200 -7200 1 %z} {1414285200 -10800 0 %z} {1427590800 -7200 1 %z} {1445734800 -10800 0 %z} {1459040400 -7200 1 %z} {1477789200 -10800 0 %z} {1490490000 -7200 1 %z} {1509238800 -10800 0 %z} {1521939600 -7200 1 %z} {1540688400 -10800 0 %z} {1553994000 -7200 1 %z} {1572138000 -10800 0 %z} {1585443600 -7200 1 %z} {1603587600 -10800 0 %z} {1616893200 -7200 1 %z} {1635642000 -10800 0 %z} {1648342800 -7200 1 %z} {1667091600 -10800 0 %z} {1679792400 -7200 0 %z} {1698541200 -7200 0 %z} {1711846800 -3600 1 %z} {1729990800 -7200 0 %z} {1743296400 -3600 1 %z} {1761440400 -7200 0 %z} {1774746000 -3600 1 %z} {1792890000 -7200 0 %z} {1806195600 -3600 1 %z} {1824944400 -7200 0 %z} {1837645200 -3600 1 %z} {1856394000 -7200 0 %z} {1869094800 -3600 1 %z} {1887843600 -7200 0 %z} {1901149200 -3600 1 %z} {1919293200 -7200 0 %z} {1932598800 -3600 1 %z} {1950742800 -7200 0 %z} {1964048400 -3600 1 %z} {1982797200 -7200 0 %z} {1995498000 -3600 1 %z} {2014246800 -7200 0 %z} {2026947600 -3600 1 %z} {2045696400 -7200 0 %z} {2058397200 -3600 1 %z} {2077146000 -7200 0 %z} {2090451600 -3600 1 %z} {2108595600 -7200 0 %z} {2121901200 -3600 1 %z} {2140045200 -7200 0 %z} {2153350800 -3600 1 %z} {2172099600 -7200 0 %z} {2184800400 -3600 1 %z} {2203549200 -7200 0 %z} {2216250000 -3600 1 %z} {2234998800 -7200 0 %z} {2248304400 -3600 1 %z} {2266448400 -7200 0 %z} {2279754000 -3600 1 %z} {2297898000 -7200 0 %z} {2311203600 -3600 1 %z} {2329347600 -7200 0 %z} {2342653200 -3600 1 %z} {2361402000 -7200 0 %z} {2374102800 -3600 1 %z} {2392851600 -7200 0 %z} {2405552400 -3600 1 %z} {2424301200 -7200 0 %z} {2437606800 -3600 1 %z} {2455750800 -7200 0 %z} {2469056400 -3600 1 %z} {2487200400 -7200 0 %z} {2500506000 -3600 1 %z} {2519254800 -7200 0 %z} {2531955600 -3600 1 %z} {2550704400 -7200 0 %z} {2563405200 -3600 1 %z} {2582154000 -7200 0 %z} {2595459600 -3600 1 %z} {2613603600 -7200 0 %z} {2626909200 -3600 1 %z} {2645053200 -7200 0 %z} {2658358800 -3600 1 %z} {2676502800 -7200 0 %z} {2689808400 -3600 1 %z} {2708557200 -7200 0 %z} {2721258000 -3600 1 %z} {2740006800 -7200 0 %z} {2752707600 -3600 1 %z} {2771456400 -7200 0 %z} {2784762000 -3600 1 %z} {2802906000 -7200 0 %z} {2816211600 -3600 1 %z} {2834355600 -7200 0 %z} {2847661200 -3600 1 %z} {2866410000 -7200 0 %z} {2879110800 -3600 1 %z} {2897859600 -7200 0 %z} {2910560400 -3600 1 %z} {2929309200 -7200 0 %z} {2942010000 -3600 1 %z} {2960758800 -7200 0 %z} {2974064400 -3600 1 %z} {2992208400 -7200 0 %z} {3005514000 -3600 1 %z} {3023658000 -7200 0 %z} {3036963600 -3600 1 %z} {3055712400 -7200 0 %z} {3068413200 -3600 1 %z} {3087162000 -7200 0 %z} {3099862800 -3600 1 %z} {3118611600 -7200 0 %z} {3131917200 -3600 1 %z} {3150061200 -7200 0 %z} {3163366800 -3600 1 %z} {3181510800 -7200 0 %z} {3194816400 -3600 1 %z} {3212960400 -7200 0 %z} {3226266000 -3600 1 %z} {3245014800 -7200 0 %z} {3257715600 -3600 1 %z} {3276464400 -7200 0 %z} {3289165200 -3600 1 %z} {3307914000 -7200 0 %z} {3321219600 -3600 1 %z} {3339363600 -7200 0 %z} {3352669200 -3600 1 %z} {3370813200 -7200 0 %z} {3384118800 -3600 1 %z} {3402867600 -7200 0 %z} {3415568400 -3600 1 %z} {3434317200 -7200 0 %z} {3447018000 -3600 1 %z} {3465766800 -7200 0 %z} {3479072400 -3600 1 %z} {3497216400 -7200 0 %z} {3510522000 -3600 1 %z} {3528666000 -7200 0 %z} {3541971600 -3600 1 %z} {3560115600 -7200 0 %z} {3573421200 -3600 1 %z} {3592170000 -7200 0 %z} {3604870800 -3600 1 %z} {3623619600 -7200 0 %z} {3636320400 -3600 1 %z} {3655069200 -7200 0 %z} {3668374800 -3600 1 %z} {3686518800 -7200 0 %z} {3699824400 -3600 1 %z} {3717968400 -7200 0 %z} {3731274000 -3600 1 %z} {3750022800 -7200 0 %z} {3762723600 -3600 1 %z} {3781472400 -7200 0 %z} {3794173200 -3600 1 %z} {3812922000 -7200 0 %z} {3825622800 -3600 1 %z} {3844371600 -7200 0 %z} {3857677200 -3600 1 %z} {3875821200 -7200 0 %z} {3889126800 -3600 1 %z} {3907270800 -7200 0 %z} {3920576400 -3600 1 %z} {3939325200 -7200 0 %z} {3952026000 -3600 1 %z} {3970774800 -7200 0 %z} {3983475600 -3600 1 %z} {4002224400 -7200 0 %z} {4015530000 -3600 1 %z} {4033674000 -7200 0 %z} {4046979600 -3600 1 %z} {4065123600 -7200 0 %z} {4078429200 -3600 1 %z} {4096573200 -7200 0 %z} } |
Changes to library/tzdata/America/Ojinaga.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Ojinaga) { {-9223372036854775808 -25060 0 LMT} {-1514739600 -25200 0 MST} | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Ojinaga) { {-9223372036854775808 -25060 0 LMT} {-1514739600 -25200 0 MST} {-1343149200 -21600 0 CST} {-1234807200 -25200 0 MST} {-1220461200 -21600 1 MDT} {-1207159200 -25200 0 MST} {-1191344400 -21600 0 CST} {820476000 -21600 0 CST} {828864000 -18000 1 CDT} {846399600 -21600 0 CST} {860313600 -18000 1 CDT} {877849200 -21600 0 CST} |
︙ | ︙ |
Changes to library/tzdata/America/Paramaribo.
1 2 3 4 5 6 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Paramaribo) { {-9223372036854775808 -13240 0 LMT} {-1861906760 -13252 0 PMT} {-1104524348 -13236 0 PMT} | | | | 1 2 3 4 5 6 7 8 9 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Paramaribo) { {-9223372036854775808 -13240 0 LMT} {-1861906760 -13252 0 PMT} {-1104524348 -13236 0 PMT} {-765317964 -12600 0 %z} {465449400 -10800 0 %z} } |
Changes to library/tzdata/America/Porto_Velho.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Porto_Velho) { {-9223372036854775808 -15336 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Porto_Velho) { {-9223372036854775808 -15336 0 LMT} {-1767210264 -14400 0 %z} {-1206954000 -10800 1 %z} {-1191358800 -14400 0 %z} {-1175371200 -10800 1 %z} {-1159822800 -14400 0 %z} {-633816000 -10800 1 %z} {-622065600 -14400 0 %z} {-602280000 -10800 1 %z} {-591829200 -14400 0 %z} {-570744000 -10800 1 %z} {-560206800 -14400 0 %z} {-539121600 -10800 1 %z} {-531349200 -14400 0 %z} {-191361600 -10800 1 %z} {-184194000 -14400 0 %z} {-155160000 -10800 1 %z} {-150066000 -14400 0 %z} {-128894400 -10800 1 %z} {-121122000 -14400 0 %z} {-99950400 -10800 1 %z} {-89586000 -14400 0 %z} {-68414400 -10800 1 %z} {-57963600 -14400 0 %z} {499752000 -10800 1 %z} {511239600 -14400 0 %z} {530596800 -10800 1 %z} {540270000 -14400 0 %z} {562132800 -10800 1 %z} {571201200 -14400 0 %z} {590036400 -14400 0 %z} } |
Changes to library/tzdata/America/Punta_Arenas.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Punta_Arenas) { {-9223372036854775808 -17020 0 LMT} {-2524504580 -16965 0 SMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Punta_Arenas) { {-9223372036854775808 -17020 0 LMT} {-2524504580 -16965 0 SMT} {-1892661435 -18000 0 %z} {-1688410800 -16965 0 SMT} {-1619205435 -14400 0 %z} {-1593806400 -16965 0 SMT} {-1335986235 -18000 0 %z} {-1335985200 -14400 1 %z} {-1317585600 -18000 0 %z} {-1304362800 -14400 1 %z} {-1286049600 -18000 0 %z} {-1272826800 -14400 1 %z} {-1254513600 -18000 0 %z} {-1241290800 -14400 1 %z} {-1222977600 -18000 0 %z} {-1209754800 -14400 1 %z} {-1191355200 -18000 0 %z} {-1178132400 -14400 0 %z} {-870552000 -18000 0 %z} {-865278000 -14400 0 %z} {-736632000 -14400 1 %z} {-718056000 -18000 0 %z} {-713649600 -14400 0 %z} {-36619200 -10800 1 %z} {-23922000 -14400 0 %z} {-3355200 -10800 1 %z} {7527600 -14400 0 %z} {24465600 -10800 1 %z} {37767600 -14400 0 %z} {55915200 -10800 1 %z} {69217200 -14400 0 %z} {87969600 -10800 1 %z} {100666800 -14400 0 %z} {118209600 -10800 1 %z} {132116400 -14400 0 %z} {150868800 -10800 1 %z} {163566000 -14400 0 %z} {182318400 -10800 1 %z} {195620400 -14400 0 %z} {213768000 -10800 1 %z} {227070000 -14400 0 %z} {245217600 -10800 1 %z} {258519600 -14400 0 %z} {277272000 -10800 1 %z} {289969200 -14400 0 %z} {308721600 -10800 1 %z} {321418800 -14400 0 %z} {340171200 -10800 1 %z} {353473200 -14400 0 %z} {371620800 -10800 1 %z} {384922800 -14400 0 %z} {403070400 -10800 1 %z} {416372400 -14400 0 %z} {434520000 -10800 1 %z} {447822000 -14400 0 %z} {466574400 -10800 1 %z} {479271600 -14400 0 %z} {498024000 -10800 1 %z} {510721200 -14400 0 %z} {529473600 -10800 1 %z} {545194800 -14400 0 %z} {560923200 -10800 1 %z} {574225200 -14400 0 %z} {592372800 -10800 1 %z} {605674800 -14400 0 %z} {624427200 -10800 1 %z} {637124400 -14400 0 %z} {653457600 -10800 1 %z} {668574000 -14400 0 %z} {687326400 -10800 1 %z} {700628400 -14400 0 %z} {718776000 -10800 1 %z} {732078000 -14400 0 %z} {750225600 -10800 1 %z} {763527600 -14400 0 %z} {781675200 -10800 1 %z} {794977200 -14400 0 %z} {813729600 -10800 1 %z} {826426800 -14400 0 %z} {845179200 -10800 1 %z} {859690800 -14400 0 %z} {876628800 -10800 1 %z} {889930800 -14400 0 %z} {906868800 -10800 1 %z} {923194800 -14400 0 %z} {939528000 -10800 1 %z} {952830000 -14400 0 %z} {971582400 -10800 1 %z} {984279600 -14400 0 %z} {1003032000 -10800 1 %z} {1015729200 -14400 0 %z} {1034481600 -10800 1 %z} {1047178800 -14400 0 %z} {1065931200 -10800 1 %z} {1079233200 -14400 0 %z} {1097380800 -10800 1 %z} {1110682800 -14400 0 %z} {1128830400 -10800 1 %z} {1142132400 -14400 0 %z} {1160884800 -10800 1 %z} {1173582000 -14400 0 %z} {1192334400 -10800 1 %z} {1206846000 -14400 0 %z} {1223784000 -10800 1 %z} {1237086000 -14400 0 %z} {1255233600 -10800 1 %z} {1270350000 -14400 0 %z} {1286683200 -10800 1 %z} {1304823600 -14400 0 %z} {1313899200 -10800 1 %z} {1335668400 -14400 0 %z} {1346558400 -10800 1 %z} {1367118000 -14400 0 %z} {1378612800 -10800 1 %z} {1398567600 -14400 0 %z} {1410062400 -10800 1 %z} {1463281200 -14400 0 %z} {1471147200 -10800 1 %z} {1480820400 -10800 0 %z} } |
Changes to library/tzdata/America/Recife.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Recife) { {-9223372036854775808 -8376 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Recife) { {-9223372036854775808 -8376 0 LMT} {-1767217224 -10800 0 %z} {-1206957600 -7200 1 %z} {-1191362400 -10800 0 %z} {-1175374800 -7200 1 %z} {-1159826400 -10800 0 %z} {-633819600 -7200 1 %z} {-622069200 -10800 0 %z} {-602283600 -7200 1 %z} {-591832800 -10800 0 %z} {-570747600 -7200 1 %z} {-560210400 -10800 0 %z} {-539125200 -7200 1 %z} {-531352800 -10800 0 %z} {-191365200 -7200 1 %z} {-184197600 -10800 0 %z} {-155163600 -7200 1 %z} {-150069600 -10800 0 %z} {-128898000 -7200 1 %z} {-121125600 -10800 0 %z} {-99954000 -7200 1 %z} {-89589600 -10800 0 %z} {-68418000 -7200 1 %z} {-57967200 -10800 0 %z} {499748400 -7200 1 %z} {511236000 -10800 0 %z} {530593200 -7200 1 %z} {540266400 -10800 0 %z} {562129200 -7200 1 %z} {571197600 -10800 0 %z} {592974000 -7200 1 %z} {602042400 -10800 0 %z} {624423600 -7200 1 %z} {634701600 -10800 0 %z} {653536800 -10800 0 %z} {938660400 -10800 0 %z} {938919600 -7200 1 %z} {951616800 -10800 0 %z} {970974000 -7200 1 %z} {971575200 -10800 0 %z} {1000350000 -10800 0 %z} {1003028400 -7200 1 %z} {1013911200 -10800 0 %z} {1033437600 -10800 0 %z} } |
Changes to library/tzdata/America/Rio_Branco.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Rio_Branco) { {-9223372036854775808 -16272 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Rio_Branco) { {-9223372036854775808 -16272 0 LMT} {-1767209328 -18000 0 %z} {-1206950400 -14400 1 %z} {-1191355200 -18000 0 %z} {-1175367600 -14400 1 %z} {-1159819200 -18000 0 %z} {-633812400 -14400 1 %z} {-622062000 -18000 0 %z} {-602276400 -14400 1 %z} {-591825600 -18000 0 %z} {-570740400 -14400 1 %z} {-560203200 -18000 0 %z} {-539118000 -14400 1 %z} {-531345600 -18000 0 %z} {-191358000 -14400 1 %z} {-184190400 -18000 0 %z} {-155156400 -14400 1 %z} {-150062400 -18000 0 %z} {-128890800 -14400 1 %z} {-121118400 -18000 0 %z} {-99946800 -14400 1 %z} {-89582400 -18000 0 %z} {-68410800 -14400 1 %z} {-57960000 -18000 0 %z} {499755600 -14400 1 %z} {511243200 -18000 0 %z} {530600400 -14400 1 %z} {540273600 -18000 0 %z} {562136400 -14400 1 %z} {571204800 -18000 0 %z} {590040000 -18000 0 %z} {1214283600 -14400 0 %z} {1384056000 -18000 0 %z} } |
Changes to library/tzdata/America/Santarem.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Santarem) { {-9223372036854775808 -13128 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Santarem) { {-9223372036854775808 -13128 0 LMT} {-1767212472 -14400 0 %z} {-1206954000 -10800 1 %z} {-1191358800 -14400 0 %z} {-1175371200 -10800 1 %z} {-1159822800 -14400 0 %z} {-633816000 -10800 1 %z} {-622065600 -14400 0 %z} {-602280000 -10800 1 %z} {-591829200 -14400 0 %z} {-570744000 -10800 1 %z} {-560206800 -14400 0 %z} {-539121600 -10800 1 %z} {-531349200 -14400 0 %z} {-191361600 -10800 1 %z} {-184194000 -14400 0 %z} {-155160000 -10800 1 %z} {-150066000 -14400 0 %z} {-128894400 -10800 1 %z} {-121122000 -14400 0 %z} {-99950400 -10800 1 %z} {-89586000 -14400 0 %z} {-68414400 -10800 1 %z} {-57963600 -14400 0 %z} {499752000 -10800 1 %z} {511239600 -14400 0 %z} {530596800 -10800 1 %z} {540270000 -14400 0 %z} {562132800 -10800 1 %z} {571201200 -14400 0 %z} {590036400 -14400 0 %z} {1214280000 -10800 0 %z} } |
Changes to library/tzdata/America/Santiago.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Santiago) { {-9223372036854775808 -16965 0 LMT} {-2524504635 -16965 0 SMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Santiago) { {-9223372036854775808 -16965 0 LMT} {-2524504635 -16965 0 SMT} {-1892661435 -18000 0 %z} {-1688410800 -16965 0 SMT} {-1619205435 -14400 0 %z} {-1593806400 -16965 0 SMT} {-1335986235 -18000 0 %z} {-1335985200 -14400 1 %z} {-1317585600 -18000 0 %z} {-1304362800 -14400 1 %z} {-1286049600 -18000 0 %z} {-1272826800 -14400 1 %z} {-1254513600 -18000 0 %z} {-1241290800 -14400 1 %z} {-1222977600 -18000 0 %z} {-1209754800 -14400 1 %z} {-1191355200 -18000 0 %z} {-1178132400 -14400 0 %z} {-870552000 -18000 0 %z} {-865278000 -14400 0 %z} {-740520000 -10800 1 %z} {-736635600 -14400 1 %z} {-718056000 -18000 0 %z} {-713649600 -14400 0 %z} {-36619200 -10800 1 %z} {-23922000 -14400 0 %z} {-3355200 -10800 1 %z} {7527600 -14400 0 %z} {24465600 -10800 1 %z} {37767600 -14400 0 %z} {55915200 -10800 1 %z} {69217200 -14400 0 %z} {87969600 -10800 1 %z} {100666800 -14400 0 %z} {118209600 -10800 1 %z} {132116400 -14400 0 %z} {150868800 -10800 1 %z} {163566000 -14400 0 %z} {182318400 -10800 1 %z} {195620400 -14400 0 %z} {213768000 -10800 1 %z} {227070000 -14400 0 %z} {245217600 -10800 1 %z} {258519600 -14400 0 %z} {277272000 -10800 1 %z} {289969200 -14400 0 %z} {308721600 -10800 1 %z} {321418800 -14400 0 %z} {340171200 -10800 1 %z} {353473200 -14400 0 %z} {371620800 -10800 1 %z} {384922800 -14400 0 %z} {403070400 -10800 1 %z} {416372400 -14400 0 %z} {434520000 -10800 1 %z} {447822000 -14400 0 %z} {466574400 -10800 1 %z} {479271600 -14400 0 %z} {498024000 -10800 1 %z} {510721200 -14400 0 %z} {529473600 -10800 1 %z} {545194800 -14400 0 %z} {560923200 -10800 1 %z} {574225200 -14400 0 %z} {592372800 -10800 1 %z} {605674800 -14400 0 %z} {624427200 -10800 1 %z} {637124400 -14400 0 %z} {653457600 -10800 1 %z} {668574000 -14400 0 %z} {687326400 -10800 1 %z} {700628400 -14400 0 %z} {718776000 -10800 1 %z} {732078000 -14400 0 %z} {750225600 -10800 1 %z} {763527600 -14400 0 %z} {781675200 -10800 1 %z} {794977200 -14400 0 %z} {813729600 -10800 1 %z} {826426800 -14400 0 %z} {845179200 -10800 1 %z} {859690800 -14400 0 %z} {876628800 -10800 1 %z} {889930800 -14400 0 %z} {906868800 -10800 1 %z} {923194800 -14400 0 %z} {939528000 -10800 1 %z} {952830000 -14400 0 %z} {971582400 -10800 1 %z} {984279600 -14400 0 %z} {1003032000 -10800 1 %z} {1015729200 -14400 0 %z} {1034481600 -10800 1 %z} {1047178800 -14400 0 %z} {1065931200 -10800 1 %z} {1079233200 -14400 0 %z} {1097380800 -10800 1 %z} {1110682800 -14400 0 %z} {1128830400 -10800 1 %z} {1142132400 -14400 0 %z} {1160884800 -10800 1 %z} {1173582000 -14400 0 %z} {1192334400 -10800 1 %z} {1206846000 -14400 0 %z} {1223784000 -10800 1 %z} {1237086000 -14400 0 %z} {1255233600 -10800 1 %z} {1270350000 -14400 0 %z} {1286683200 -10800 1 %z} {1304823600 -14400 0 %z} {1313899200 -10800 1 %z} {1335668400 -14400 0 %z} {1346558400 -10800 1 %z} {1367118000 -14400 0 %z} {1378612800 -10800 1 %z} {1398567600 -14400 0 %z} {1410062400 -10800 1 %z} {1463281200 -14400 0 %z} {1471147200 -10800 1 %z} {1494730800 -14400 0 %z} {1502596800 -10800 1 %z} {1526180400 -14400 0 %z} {1534046400 -10800 1 %z} {1554606000 -14400 0 %z} {1567915200 -10800 1 %z} {1586055600 -14400 0 %z} {1599364800 -10800 1 %z} {1617505200 -14400 0 %z} {1630814400 -10800 1 %z} {1648954800 -14400 0 %z} {1662868800 -10800 1 %z} {1680404400 -14400 0 %z} {1693713600 -10800 1 %z} {1712458800 -14400 0 %z} {1725768000 -10800 1 %z} {1743908400 -14400 0 %z} {1757217600 -10800 1 %z} {1775358000 -14400 0 %z} {1788667200 -10800 1 %z} {1806807600 -14400 0 %z} {1820116800 -10800 1 %z} {1838257200 -14400 0 %z} {1851566400 -10800 1 %z} {1870311600 -14400 0 %z} {1883016000 -10800 1 %z} {1901761200 -14400 0 %z} {1915070400 -10800 1 %z} {1933210800 -14400 0 %z} {1946520000 -10800 1 %z} {1964660400 -14400 0 %z} {1977969600 -10800 1 %z} {1996110000 -14400 0 %z} {2009419200 -10800 1 %z} {2027559600 -14400 0 %z} {2040868800 -10800 1 %z} {2059614000 -14400 0 %z} {2072318400 -10800 1 %z} {2091063600 -14400 0 %z} {2104372800 -10800 1 %z} {2122513200 -14400 0 %z} {2135822400 -10800 1 %z} {2153962800 -14400 0 %z} {2167272000 -10800 1 %z} {2185412400 -14400 0 %z} {2198721600 -10800 1 %z} {2217466800 -14400 0 %z} {2230171200 -10800 1 %z} {2248916400 -14400 0 %z} {2262225600 -10800 1 %z} {2280366000 -14400 0 %z} {2293675200 -10800 1 %z} {2311815600 -14400 0 %z} {2325124800 -10800 1 %z} {2343265200 -14400 0 %z} {2356574400 -10800 1 %z} {2374714800 -14400 0 %z} {2388024000 -10800 1 %z} {2406769200 -14400 0 %z} {2419473600 -10800 1 %z} {2438218800 -14400 0 %z} {2451528000 -10800 1 %z} {2469668400 -14400 0 %z} {2482977600 -10800 1 %z} {2501118000 -14400 0 %z} {2514427200 -10800 1 %z} {2532567600 -14400 0 %z} {2545876800 -10800 1 %z} {2564017200 -14400 0 %z} {2577326400 -10800 1 %z} {2596071600 -14400 0 %z} {2609380800 -10800 1 %z} {2627521200 -14400 0 %z} {2640830400 -10800 1 %z} {2658970800 -14400 0 %z} {2672280000 -10800 1 %z} {2690420400 -14400 0 %z} {2703729600 -10800 1 %z} {2721870000 -14400 0 %z} {2735179200 -10800 1 %z} {2753924400 -14400 0 %z} {2766628800 -10800 1 %z} {2785374000 -14400 0 %z} {2798683200 -10800 1 %z} {2816823600 -14400 0 %z} {2830132800 -10800 1 %z} {2848273200 -14400 0 %z} {2861582400 -10800 1 %z} {2879722800 -14400 0 %z} {2893032000 -10800 1 %z} {2911172400 -14400 0 %z} {2924481600 -10800 1 %z} {2943226800 -14400 0 %z} {2955931200 -10800 1 %z} {2974676400 -14400 0 %z} {2987985600 -10800 1 %z} {3006126000 -14400 0 %z} {3019435200 -10800 1 %z} {3037575600 -14400 0 %z} {3050884800 -10800 1 %z} {3069025200 -14400 0 %z} {3082334400 -10800 1 %z} {3101079600 -14400 0 %z} {3113784000 -10800 1 %z} {3132529200 -14400 0 %z} {3145838400 -10800 1 %z} {3163978800 -14400 0 %z} {3177288000 -10800 1 %z} {3195428400 -14400 0 %z} {3208737600 -10800 1 %z} {3226878000 -14400 0 %z} {3240187200 -10800 1 %z} {3258327600 -14400 0 %z} {3271636800 -10800 1 %z} {3290382000 -14400 0 %z} {3303086400 -10800 1 %z} {3321831600 -14400 0 %z} {3335140800 -10800 1 %z} {3353281200 -14400 0 %z} {3366590400 -10800 1 %z} {3384730800 -14400 0 %z} {3398040000 -10800 1 %z} {3416180400 -14400 0 %z} {3429489600 -10800 1 %z} {3447630000 -14400 0 %z} {3460939200 -10800 1 %z} {3479684400 -14400 0 %z} {3492993600 -10800 1 %z} {3511134000 -14400 0 %z} {3524443200 -10800 1 %z} {3542583600 -14400 0 %z} {3555892800 -10800 1 %z} {3574033200 -14400 0 %z} {3587342400 -10800 1 %z} {3605482800 -14400 0 %z} {3618792000 -10800 1 %z} {3637537200 -14400 0 %z} {3650241600 -10800 1 %z} {3668986800 -14400 0 %z} {3682296000 -10800 1 %z} {3700436400 -14400 0 %z} {3713745600 -10800 1 %z} {3731886000 -14400 0 %z} {3745195200 -10800 1 %z} {3763335600 -14400 0 %z} {3776644800 -10800 1 %z} {3794785200 -14400 0 %z} {3808094400 -10800 1 %z} {3826839600 -14400 0 %z} {3839544000 -10800 1 %z} {3858289200 -14400 0 %z} {3871598400 -10800 1 %z} {3889738800 -14400 0 %z} {3903048000 -10800 1 %z} {3921188400 -14400 0 %z} {3934497600 -10800 1 %z} {3952638000 -14400 0 %z} {3965947200 -10800 1 %z} {3984692400 -14400 0 %z} {3997396800 -10800 1 %z} {4016142000 -14400 0 %z} {4029451200 -10800 1 %z} {4047591600 -14400 0 %z} {4060900800 -10800 1 %z} {4079041200 -14400 0 %z} {4092350400 -10800 1 %z} } |
Changes to library/tzdata/America/Sao_Paulo.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Sao_Paulo) { {-9223372036854775808 -11188 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Sao_Paulo) { {-9223372036854775808 -11188 0 LMT} {-1767214412 -10800 0 %z} {-1206957600 -7200 1 %z} {-1191362400 -10800 0 %z} {-1175374800 -7200 1 %z} {-1159826400 -10800 0 %z} {-633819600 -7200 1 %z} {-622069200 -10800 0 %z} {-602283600 -7200 1 %z} {-591832800 -10800 0 %z} {-570747600 -7200 1 %z} {-560210400 -10800 0 %z} {-539125200 -7200 1 %z} {-531352800 -10800 0 %z} {-195429600 -7200 1 %z} {-189381600 -7200 0 %z} {-184197600 -10800 0 %z} {-155163600 -7200 1 %z} {-150069600 -10800 0 %z} {-128898000 -7200 1 %z} {-121125600 -10800 0 %z} {-99954000 -7200 1 %z} {-89589600 -10800 0 %z} {-68418000 -7200 1 %z} {-57967200 -10800 0 %z} {499748400 -7200 1 %z} {511236000 -10800 0 %z} {530593200 -7200 1 %z} {540266400 -10800 0 %z} {562129200 -7200 1 %z} {571197600 -10800 0 %z} {592974000 -7200 1 %z} {602042400 -10800 0 %z} {624423600 -7200 1 %z} {634701600 -10800 0 %z} {656478000 -7200 1 %z} {666756000 -10800 0 %z} {687927600 -7200 1 %z} {697600800 -10800 0 %z} {719982000 -7200 1 %z} {728445600 -10800 0 %z} {750826800 -7200 1 %z} {761709600 -10800 0 %z} {782276400 -7200 1 %z} {793159200 -10800 0 %z} {813726000 -7200 1 %z} {824004000 -10800 0 %z} {844570800 -7200 1 %z} {856058400 -10800 0 %z} {876106800 -7200 1 %z} {888717600 -10800 0 %z} {908074800 -7200 1 %z} {919562400 -10800 0 %z} {938919600 -7200 1 %z} {951616800 -10800 0 %z} {970974000 -7200 1 %z} {982461600 -10800 0 %z} {1003028400 -7200 1 %z} {1013911200 -10800 0 %z} {1036292400 -7200 1 %z} {1045360800 -10800 0 %z} {1066532400 -7200 1 %z} {1076810400 -10800 0 %z} {1099364400 -7200 1 %z} {1108864800 -10800 0 %z} {1129431600 -7200 1 %z} {1140314400 -10800 0 %z} {1162695600 -7200 1 %z} {1172368800 -10800 0 %z} {1192330800 -7200 1 %z} {1203213600 -10800 0 %z} {1224385200 -7200 1 %z} {1234663200 -10800 0 %z} {1255834800 -7200 1 %z} {1266717600 -10800 0 %z} {1287284400 -7200 1 %z} {1298167200 -10800 0 %z} {1318734000 -7200 1 %z} {1330221600 -10800 0 %z} {1350788400 -7200 1 %z} {1361066400 -10800 0 %z} {1382238000 -7200 1 %z} {1392516000 -10800 0 %z} {1413687600 -7200 1 %z} {1424570400 -10800 0 %z} {1445137200 -7200 1 %z} {1456020000 -10800 0 %z} {1476586800 -7200 1 %z} {1487469600 -10800 0 %z} {1508036400 -7200 1 %z} {1518919200 -10800 0 %z} {1541300400 -7200 1 %z} {1550368800 -10800 0 %z} } |
Changes to library/tzdata/America/Scoresbysund.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Scoresbysund) { {-9223372036854775808 -5272 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Scoresbysund) { {-9223372036854775808 -5272 0 LMT} {-1686090728 -7200 0 %z} {323841600 -3600 0 %z} {338961600 -7200 0 %z} {354679200 0 0 %z} {370400400 -3600 0 %z} {386125200 0 1 %z} {401850000 -3600 0 %z} {417574800 0 1 %z} {433299600 -3600 0 %z} {449024400 0 1 %z} {465354000 -3600 0 %z} {481078800 0 1 %z} {496803600 -3600 0 %z} {512528400 0 1 %z} {528253200 -3600 0 %z} {543978000 0 1 %z} {559702800 -3600 0 %z} {575427600 0 1 %z} {591152400 -3600 0 %z} {606877200 0 1 %z} {622602000 -3600 0 %z} {638326800 0 1 %z} {654656400 -3600 0 %z} {670381200 0 1 %z} {686106000 -3600 0 %z} {701830800 0 1 %z} {717555600 -3600 0 %z} {733280400 0 1 %z} {749005200 -3600 0 %z} {764730000 0 1 %z} {780454800 -3600 0 %z} {796179600 0 1 %z} {811904400 -3600 0 %z} {828234000 0 1 %z} {846378000 -3600 0 %z} {859683600 0 1 %z} {877827600 -3600 0 %z} {891133200 0 1 %z} {909277200 -3600 0 %z} {922582800 0 1 %z} {941331600 -3600 0 %z} {954032400 0 1 %z} {972781200 -3600 0 %z} {985482000 0 1 %z} {1004230800 -3600 0 %z} {1017536400 0 1 %z} {1035680400 -3600 0 %z} {1048986000 0 1 %z} {1067130000 -3600 0 %z} {1080435600 0 1 %z} {1099184400 -3600 0 %z} {1111885200 0 1 %z} {1130634000 -3600 0 %z} {1143334800 0 1 %z} {1162083600 -3600 0 %z} {1174784400 0 1 %z} {1193533200 -3600 0 %z} {1206838800 0 1 %z} {1224982800 -3600 0 %z} {1238288400 0 1 %z} {1256432400 -3600 0 %z} {1269738000 0 1 %z} {1288486800 -3600 0 %z} {1301187600 0 1 %z} {1319936400 -3600 0 %z} {1332637200 0 1 %z} {1351386000 -3600 0 %z} {1364691600 0 1 %z} {1382835600 -3600 0 %z} {1396141200 0 1 %z} {1414285200 -3600 0 %z} {1427590800 0 1 %z} {1445734800 -3600 0 %z} {1459040400 0 1 %z} {1477789200 -3600 0 %z} {1490490000 0 1 %z} {1509238800 -3600 0 %z} {1521939600 0 1 %z} {1540688400 -3600 0 %z} {1553994000 0 1 %z} {1572138000 -3600 0 %z} {1585443600 0 1 %z} {1603587600 -3600 0 %z} {1616893200 0 1 %z} {1635642000 -3600 0 %z} {1648342800 0 1 %z} {1667091600 -3600 0 %z} {1679792400 0 1 %z} {1698541200 -3600 0 %z} {1711846800 -3600 0 %z} {1729990800 -7200 0 %z} {1743296400 -3600 1 %z} {1761440400 -7200 0 %z} {1774746000 -3600 1 %z} {1792890000 -7200 0 %z} {1806195600 -3600 1 %z} {1824944400 -7200 0 %z} {1837645200 -3600 1 %z} {1856394000 -7200 0 %z} {1869094800 -3600 1 %z} {1887843600 -7200 0 %z} {1901149200 -3600 1 %z} {1919293200 -7200 0 %z} {1932598800 -3600 1 %z} {1950742800 -7200 0 %z} {1964048400 -3600 1 %z} {1982797200 -7200 0 %z} {1995498000 -3600 1 %z} {2014246800 -7200 0 %z} {2026947600 -3600 1 %z} {2045696400 -7200 0 %z} {2058397200 -3600 1 %z} {2077146000 -7200 0 %z} {2090451600 -3600 1 %z} {2108595600 -7200 0 %z} {2121901200 -3600 1 %z} {2140045200 -7200 0 %z} {2153350800 -3600 1 %z} {2172099600 -7200 0 %z} {2184800400 -3600 1 %z} {2203549200 -7200 0 %z} {2216250000 -3600 1 %z} {2234998800 -7200 0 %z} {2248304400 -3600 1 %z} {2266448400 -7200 0 %z} {2279754000 -3600 1 %z} {2297898000 -7200 0 %z} {2311203600 -3600 1 %z} {2329347600 -7200 0 %z} {2342653200 -3600 1 %z} {2361402000 -7200 0 %z} {2374102800 -3600 1 %z} {2392851600 -7200 0 %z} {2405552400 -3600 1 %z} {2424301200 -7200 0 %z} {2437606800 -3600 1 %z} {2455750800 -7200 0 %z} {2469056400 -3600 1 %z} {2487200400 -7200 0 %z} {2500506000 -3600 1 %z} {2519254800 -7200 0 %z} {2531955600 -3600 1 %z} {2550704400 -7200 0 %z} {2563405200 -3600 1 %z} {2582154000 -7200 0 %z} {2595459600 -3600 1 %z} {2613603600 -7200 0 %z} {2626909200 -3600 1 %z} {2645053200 -7200 0 %z} {2658358800 -3600 1 %z} {2676502800 -7200 0 %z} {2689808400 -3600 1 %z} {2708557200 -7200 0 %z} {2721258000 -3600 1 %z} {2740006800 -7200 0 %z} {2752707600 -3600 1 %z} {2771456400 -7200 0 %z} {2784762000 -3600 1 %z} {2802906000 -7200 0 %z} {2816211600 -3600 1 %z} {2834355600 -7200 0 %z} {2847661200 -3600 1 %z} {2866410000 -7200 0 %z} {2879110800 -3600 1 %z} {2897859600 -7200 0 %z} {2910560400 -3600 1 %z} {2929309200 -7200 0 %z} {2942010000 -3600 1 %z} {2960758800 -7200 0 %z} {2974064400 -3600 1 %z} {2992208400 -7200 0 %z} {3005514000 -3600 1 %z} {3023658000 -7200 0 %z} {3036963600 -3600 1 %z} {3055712400 -7200 0 %z} {3068413200 -3600 1 %z} {3087162000 -7200 0 %z} {3099862800 -3600 1 %z} {3118611600 -7200 0 %z} {3131917200 -3600 1 %z} {3150061200 -7200 0 %z} {3163366800 -3600 1 %z} {3181510800 -7200 0 %z} {3194816400 -3600 1 %z} {3212960400 -7200 0 %z} {3226266000 -3600 1 %z} {3245014800 -7200 0 %z} {3257715600 -3600 1 %z} {3276464400 -7200 0 %z} {3289165200 -3600 1 %z} {3307914000 -7200 0 %z} {3321219600 -3600 1 %z} {3339363600 -7200 0 %z} {3352669200 -3600 1 %z} {3370813200 -7200 0 %z} {3384118800 -3600 1 %z} {3402867600 -7200 0 %z} {3415568400 -3600 1 %z} {3434317200 -7200 0 %z} {3447018000 -3600 1 %z} {3465766800 -7200 0 %z} {3479072400 -3600 1 %z} {3497216400 -7200 0 %z} {3510522000 -3600 1 %z} {3528666000 -7200 0 %z} {3541971600 -3600 1 %z} {3560115600 -7200 0 %z} {3573421200 -3600 1 %z} {3592170000 -7200 0 %z} {3604870800 -3600 1 %z} {3623619600 -7200 0 %z} {3636320400 -3600 1 %z} {3655069200 -7200 0 %z} {3668374800 -3600 1 %z} {3686518800 -7200 0 %z} {3699824400 -3600 1 %z} {3717968400 -7200 0 %z} {3731274000 -3600 1 %z} {3750022800 -7200 0 %z} {3762723600 -3600 1 %z} {3781472400 -7200 0 %z} {3794173200 -3600 1 %z} {3812922000 -7200 0 %z} {3825622800 -3600 1 %z} {3844371600 -7200 0 %z} {3857677200 -3600 1 %z} {3875821200 -7200 0 %z} {3889126800 -3600 1 %z} {3907270800 -7200 0 %z} {3920576400 -3600 1 %z} {3939325200 -7200 0 %z} {3952026000 -3600 1 %z} {3970774800 -7200 0 %z} {3983475600 -3600 1 %z} {4002224400 -7200 0 %z} {4015530000 -3600 1 %z} {4033674000 -7200 0 %z} {4046979600 -3600 1 %z} {4065123600 -7200 0 %z} {4078429200 -3600 1 %z} {4096573200 -7200 0 %z} } |
Changes to library/tzdata/America/Tijuana.
1 2 3 4 5 6 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Tijuana) { {-9223372036854775808 -28084 0 LMT} {-1514739600 -25200 0 MST} {-1451667600 -28800 0 PST} | | | > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | # created by tools/tclZIC.tcl - do not edit set TZData(:America/Tijuana) { {-9223372036854775808 -28084 0 LMT} {-1514739600 -25200 0 MST} {-1451667600 -28800 0 PST} {-1343145600 -25200 0 MST} {-1234803600 -28800 0 PST} {-1222963200 -25200 1 PDT} {-1207242000 -28800 0 PST} {-873820800 -25200 1 PWT} {-769395600 -25200 1 PPT} {-761418000 -28800 0 PST} {-686073600 -25200 1 PDT} {-661539600 -28800 0 PST} {-620755200 -25200 1 PDT} {-608144400 -28800 0 PST} {-589384800 -25200 1 PDT} {-576082800 -28800 0 PST} {-557935200 -25200 1 PDT} {-544633200 -28800 0 PST} {-504892800 -28800 0 PST} {-495039600 -25200 1 PDT} {-481734000 -28800 0 PST} {-463590000 -25200 1 PDT} {-450284400 -28800 0 PST} {-431535600 -25200 1 PDT} {-418230000 -28800 0 PST} |
︙ | ︙ |
Changes to library/tzdata/Antarctica/Casey.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Antarctica/Casey) { {-9223372036854775808 0 0 -00} | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | # created by tools/tclZIC.tcl - do not edit set TZData(:Antarctica/Casey) { {-9223372036854775808 0 0 -00} {-31536000 28800 0 %z} {1255802400 39600 0 %z} {1267714800 28800 0 %z} {1319738400 39600 0 %z} {1329843600 28800 0 %z} {1477065600 39600 0 %z} {1520701200 28800 0 %z} {1538856000 39600 0 %z} {1552752000 28800 0 %z} {1570129200 39600 0 %z} {1583596800 28800 0 %z} {1601740860 39600 0 %z} {1615640400 28800 0 %z} {1633190460 39600 0 %z} {1647090000 28800 0 %z} {1664640060 39600 0 %z} {1678291200 28800 0 %z} } |
Changes to library/tzdata/Antarctica/Davis.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Antarctica/Davis) { {-9223372036854775808 0 0 -00} | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 | # created by tools/tclZIC.tcl - do not edit set TZData(:Antarctica/Davis) { {-9223372036854775808 0 0 -00} {-409190400 25200 0 %z} {-163062000 0 0 -00} {-28857600 25200 0 %z} {1255806000 18000 0 %z} {1268251200 25200 0 %z} {1319742000 18000 0 %z} {1329854400 25200 0 %z} } |
Changes to library/tzdata/Antarctica/Mawson.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Antarctica/Mawson) { {-9223372036854775808 0 0 -00} | | | | 1 2 3 4 5 6 7 | # created by tools/tclZIC.tcl - do not edit set TZData(:Antarctica/Mawson) { {-9223372036854775808 0 0 -00} {-501206400 21600 0 %z} {1255809600 18000 0 %z} } |
Changes to library/tzdata/Antarctica/Palmer.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Antarctica/Palmer) { {-9223372036854775808 0 0 -00} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | # created by tools/tclZIC.tcl - do not edit set TZData(:Antarctica/Palmer) { {-9223372036854775808 0 0 -00} {-157766400 -14400 0 %z} {-152654400 -14400 0 %z} {-132955200 -10800 1 %z} {-121122000 -14400 0 %z} {-101419200 -10800 1 %z} {-86821200 -14400 0 %z} {-71092800 -10800 1 %z} {-54766800 -14400 0 %z} {-39038400 -10800 1 %z} {-23317200 -14400 0 %z} {-7588800 -10800 0 %z} {128142000 -7200 1 %z} {136605600 -10800 0 %z} {389070000 -14400 0 %z} {403070400 -10800 1 %z} {416372400 -14400 0 %z} {434520000 -10800 1 %z} {447822000 -14400 0 %z} {466574400 -10800 1 %z} {479271600 -14400 0 %z} {498024000 -10800 1 %z} {510721200 -14400 0 %z} {529473600 -10800 1 %z} {545194800 -14400 0 %z} {560923200 -10800 1 %z} {574225200 -14400 0 %z} {592372800 -10800 1 %z} {605674800 -14400 0 %z} {624427200 -10800 1 %z} {637124400 -14400 0 %z} {653457600 -10800 1 %z} {668574000 -14400 0 %z} {687326400 -10800 1 %z} {700628400 -14400 0 %z} {718776000 -10800 1 %z} {732078000 -14400 0 %z} {750225600 -10800 1 %z} {763527600 -14400 0 %z} {781675200 -10800 1 %z} {794977200 -14400 0 %z} {813729600 -10800 1 %z} {826426800 -14400 0 %z} {845179200 -10800 1 %z} {859690800 -14400 0 %z} {876628800 -10800 1 %z} {889930800 -14400 0 %z} {906868800 -10800 1 %z} {923194800 -14400 0 %z} {939528000 -10800 1 %z} {952830000 -14400 0 %z} {971582400 -10800 1 %z} {984279600 -14400 0 %z} {1003032000 -10800 1 %z} {1015729200 -14400 0 %z} {1034481600 -10800 1 %z} {1047178800 -14400 0 %z} {1065931200 -10800 1 %z} {1079233200 -14400 0 %z} {1097380800 -10800 1 %z} {1110682800 -14400 0 %z} {1128830400 -10800 1 %z} {1142132400 -14400 0 %z} {1160884800 -10800 1 %z} {1173582000 -14400 0 %z} {1192334400 -10800 1 %z} {1206846000 -14400 0 %z} {1223784000 -10800 1 %z} {1237086000 -14400 0 %z} {1255233600 -10800 1 %z} {1270350000 -14400 0 %z} {1286683200 -10800 1 %z} {1304823600 -14400 0 %z} {1313899200 -10800 1 %z} {1335668400 -14400 0 %z} {1346558400 -10800 1 %z} {1367118000 -14400 0 %z} {1378612800 -10800 1 %z} {1398567600 -14400 0 %z} {1410062400 -10800 1 %z} {1463281200 -14400 0 %z} {1471147200 -10800 1 %z} {1480820400 -10800 0 %z} } |
Changes to library/tzdata/Antarctica/Rothera.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Antarctica/Rothera) { {-9223372036854775808 0 0 -00} | | | 1 2 3 4 5 6 | # created by tools/tclZIC.tcl - do not edit set TZData(:Antarctica/Rothera) { {-9223372036854775808 0 0 -00} {218246400 -10800 0 %z} } |
Changes to library/tzdata/Antarctica/Vostok.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Antarctica/Vostok) { {-9223372036854775808 0 0 -00} | | | | | 1 2 3 4 5 6 7 8 9 | # created by tools/tclZIC.tcl - do not edit set TZData(:Antarctica/Vostok) { {-9223372036854775808 0 0 -00} {-380073600 25200 0 %z} {760035600 0 0 -00} {783648000 25200 0 %z} {1702839600 18000 0 %z} } |
Changes to library/tzdata/Asia/Almaty.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Almaty) { {-9223372036854775808 18468 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Almaty) { {-9223372036854775808 18468 0 LMT} {-1441170468 18000 0 %z} {-1247547600 21600 0 %z} {354909600 25200 1 %z} {370717200 21600 0 %z} {386445600 25200 1 %z} {402253200 21600 0 %z} {417981600 25200 1 %z} {433789200 21600 0 %z} {449604000 25200 1 %z} {465336000 21600 0 %z} {481060800 25200 1 %z} {496785600 21600 0 %z} {512510400 25200 1 %z} {528235200 21600 0 %z} {543960000 25200 1 %z} {559684800 21600 0 %z} {575409600 25200 1 %z} {591134400 21600 0 %z} {606859200 25200 1 %z} {622584000 21600 0 %z} {638308800 25200 1 %z} {654638400 21600 0 %z} {670363200 18000 0 %z} {670366800 21600 1 %z} {686091600 18000 0 %z} {695768400 21600 0 %z} {701812800 25200 1 %z} {717537600 21600 0 %z} {733262400 25200 1 %z} {748987200 21600 0 %z} {764712000 25200 1 %z} {780436800 21600 0 %z} {796161600 25200 1 %z} {811886400 21600 0 %z} {828216000 25200 1 %z} {846360000 21600 0 %z} {859665600 25200 1 %z} {877809600 21600 0 %z} {891115200 25200 1 %z} {909259200 21600 0 %z} {922564800 25200 1 %z} {941313600 21600 0 %z} {954014400 25200 1 %z} {972763200 21600 0 %z} {985464000 25200 1 %z} {1004212800 21600 0 %z} {1017518400 25200 1 %z} {1035662400 21600 0 %z} {1048968000 25200 1 %z} {1067112000 21600 0 %z} {1080417600 25200 1 %z} {1099166400 21600 0 %z} {1709229600 18000 0 %z} } |
Changes to library/tzdata/Asia/Amman.
︙ | ︙ | |||
84 85 86 87 88 89 90 | {1553810400 10800 1 EEST} {1571954400 7200 0 EET} {1585260000 10800 1 EEST} {1604008800 7200 0 EET} {1616709600 10800 1 EEST} {1635458400 7200 0 EET} {1645740000 10800 1 EEST} | | | 84 85 86 87 88 89 90 91 92 | {1553810400 10800 1 EEST} {1571954400 7200 0 EET} {1585260000 10800 1 EEST} {1604008800 7200 0 EET} {1616709600 10800 1 EEST} {1635458400 7200 0 EET} {1645740000 10800 1 EEST} {1666908000 10800 0 %z} } |
Changes to library/tzdata/Asia/Anadyr.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Anadyr) { {-9223372036854775808 42596 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Anadyr) { {-9223372036854775808 42596 0 LMT} {-1441194596 43200 0 %z} {-1247572800 46800 0 %z} {354884400 50400 1 %z} {370692000 46800 0 %z} {386420400 43200 0 %z} {386424000 46800 1 %z} {402231600 43200 0 %z} {417960000 46800 1 %z} {433767600 43200 0 %z} {449582400 46800 1 %z} {465314400 43200 0 %z} {481039200 46800 1 %z} {496764000 43200 0 %z} {512488800 46800 1 %z} {528213600 43200 0 %z} {543938400 46800 1 %z} {559663200 43200 0 %z} {575388000 46800 1 %z} {591112800 43200 0 %z} {606837600 46800 1 %z} {622562400 43200 0 %z} {638287200 46800 1 %z} {654616800 43200 0 %z} {670341600 39600 0 %z} {670345200 43200 1 %z} {686070000 39600 0 %z} {695746800 43200 0 %z} {701791200 46800 1 %z} {717516000 43200 0 %z} {733240800 46800 1 %z} {748965600 43200 0 %z} {764690400 46800 1 %z} {780415200 43200 0 %z} {796140000 46800 1 %z} {811864800 43200 0 %z} {828194400 46800 1 %z} {846338400 43200 0 %z} {859644000 46800 1 %z} {877788000 43200 0 %z} {891093600 46800 1 %z} {909237600 43200 0 %z} {922543200 46800 1 %z} {941292000 43200 0 %z} {953992800 46800 1 %z} {972741600 43200 0 %z} {985442400 46800 1 %z} {1004191200 43200 0 %z} {1017496800 46800 1 %z} {1035640800 43200 0 %z} {1048946400 46800 1 %z} {1067090400 43200 0 %z} {1080396000 46800 1 %z} {1099144800 43200 0 %z} {1111845600 46800 1 %z} {1130594400 43200 0 %z} {1143295200 46800 1 %z} {1162044000 43200 0 %z} {1174744800 46800 1 %z} {1193493600 43200 0 %z} {1206799200 46800 1 %z} {1224943200 43200 0 %z} {1238248800 46800 1 %z} {1256392800 43200 0 %z} {1269698400 39600 0 %z} {1269702000 43200 1 %z} {1288450800 39600 0 %z} {1301151600 43200 0 %z} } |
Changes to library/tzdata/Asia/Aqtau.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Aqtau) { {-9223372036854775808 12064 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Aqtau) { {-9223372036854775808 12064 0 LMT} {-1441164064 14400 0 %z} {-1247544000 18000 0 %z} {370724400 21600 0 %z} {386445600 18000 0 %z} {386449200 21600 1 %z} {402256800 18000 0 %z} {417985200 21600 1 %z} {433792800 18000 0 %z} {449607600 21600 1 %z} {465339600 18000 0 %z} {481064400 21600 1 %z} {496789200 18000 0 %z} {512514000 21600 1 %z} {528238800 18000 0 %z} {543963600 21600 1 %z} {559688400 18000 0 %z} {575413200 21600 1 %z} {591138000 18000 0 %z} {606862800 21600 1 %z} {622587600 18000 0 %z} {638312400 21600 1 %z} {654642000 18000 0 %z} {670366800 14400 0 %z} {670370400 18000 1 %z} {686095200 14400 0 %z} {695772000 18000 0 %z} {701816400 21600 1 %z} {717541200 18000 0 %z} {733266000 21600 1 %z} {748990800 18000 0 %z} {764715600 21600 1 %z} {780440400 18000 0 %z} {780444000 14400 0 %z} {796168800 18000 1 %z} {811893600 14400 0 %z} {828223200 18000 1 %z} {846367200 14400 0 %z} {859672800 18000 1 %z} {877816800 14400 0 %z} {891122400 18000 1 %z} {909266400 14400 0 %z} {922572000 18000 1 %z} {941320800 14400 0 %z} {954021600 18000 1 %z} {972770400 14400 0 %z} {985471200 18000 1 %z} {1004220000 14400 0 %z} {1017525600 18000 1 %z} {1035669600 14400 0 %z} {1048975200 18000 1 %z} {1067119200 14400 0 %z} {1080424800 18000 1 %z} {1099173600 18000 0 %z} } |
Changes to library/tzdata/Asia/Aqtobe.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Aqtobe) { {-9223372036854775808 13720 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Aqtobe) { {-9223372036854775808 13720 0 LMT} {-1441165720 14400 0 %z} {-1247544000 18000 0 %z} {354913200 21600 1 %z} {370720800 21600 0 %z} {386445600 18000 0 %z} {386449200 21600 1 %z} {402256800 18000 0 %z} {417985200 21600 1 %z} {433792800 18000 0 %z} {449607600 21600 1 %z} {465339600 18000 0 %z} {481064400 21600 1 %z} {496789200 18000 0 %z} {512514000 21600 1 %z} {528238800 18000 0 %z} {543963600 21600 1 %z} {559688400 18000 0 %z} {575413200 21600 1 %z} {591138000 18000 0 %z} {606862800 21600 1 %z} {622587600 18000 0 %z} {638312400 21600 1 %z} {654642000 18000 0 %z} {670366800 14400 0 %z} {670370400 18000 1 %z} {686095200 14400 0 %z} {695772000 18000 0 %z} {701816400 21600 1 %z} {717541200 18000 0 %z} {733266000 21600 1 %z} {748990800 18000 0 %z} {764715600 21600 1 %z} {780440400 18000 0 %z} {796165200 21600 1 %z} {811890000 18000 0 %z} {828219600 21600 1 %z} {846363600 18000 0 %z} {859669200 21600 1 %z} {877813200 18000 0 %z} {891118800 21600 1 %z} {909262800 18000 0 %z} {922568400 21600 1 %z} {941317200 18000 0 %z} {954018000 21600 1 %z} {972766800 18000 0 %z} {985467600 21600 1 %z} {1004216400 18000 0 %z} {1017522000 21600 1 %z} {1035666000 18000 0 %z} {1048971600 21600 1 %z} {1067115600 18000 0 %z} {1080421200 21600 1 %z} {1099170000 18000 0 %z} } |
Changes to library/tzdata/Asia/Ashgabat.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Ashgabat) { {-9223372036854775808 14012 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Ashgabat) { {-9223372036854775808 14012 0 LMT} {-1441166012 14400 0 %z} {-1247544000 18000 0 %z} {354913200 21600 1 %z} {370720800 18000 0 %z} {386449200 21600 1 %z} {402256800 18000 0 %z} {417985200 21600 1 %z} {433792800 18000 0 %z} {449607600 21600 1 %z} {465339600 18000 0 %z} {481064400 21600 1 %z} {496789200 18000 0 %z} {512514000 21600 1 %z} {528238800 18000 0 %z} {543963600 21600 1 %z} {559688400 18000 0 %z} {575413200 21600 1 %z} {591138000 18000 0 %z} {606862800 21600 1 %z} {622587600 18000 0 %z} {638312400 21600 1 %z} {654642000 18000 0 %z} {670366800 14400 0 %z} {670370400 18000 1 %z} {686095200 14400 0 %z} {695772000 18000 0 %z} } |
Changes to library/tzdata/Asia/Atyrau.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Atyrau) { {-9223372036854775808 12464 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Atyrau) { {-9223372036854775808 12464 0 LMT} {-1441164464 10800 0 %z} {-1247540400 18000 0 %z} {370724400 21600 0 %z} {386445600 18000 0 %z} {386449200 21600 1 %z} {402256800 18000 0 %z} {417985200 21600 1 %z} {433792800 18000 0 %z} {449607600 21600 1 %z} {465339600 18000 0 %z} {481064400 21600 1 %z} {496789200 18000 0 %z} {512514000 21600 1 %z} {528238800 18000 0 %z} {543963600 21600 1 %z} {559688400 18000 0 %z} {575413200 21600 1 %z} {591138000 18000 0 %z} {606862800 21600 1 %z} {622587600 18000 0 %z} {638312400 21600 1 %z} {654642000 18000 0 %z} {670366800 14400 0 %z} {670370400 18000 1 %z} {686095200 14400 0 %z} {695772000 18000 0 %z} {701816400 21600 1 %z} {717541200 18000 0 %z} {733266000 21600 1 %z} {748990800 18000 0 %z} {764715600 21600 1 %z} {780440400 18000 0 %z} {796165200 21600 1 %z} {811890000 18000 0 %z} {828219600 21600 1 %z} {846363600 18000 0 %z} {859669200 21600 1 %z} {877813200 18000 0 %z} {891118800 21600 1 %z} {909262800 18000 0 %z} {922568400 14400 0 %z} {922572000 18000 1 %z} {941320800 14400 0 %z} {954021600 18000 1 %z} {972770400 14400 0 %z} {985471200 18000 1 %z} {1004220000 14400 0 %z} {1017525600 18000 1 %z} {1035669600 14400 0 %z} {1048975200 18000 1 %z} {1067119200 14400 0 %z} {1080424800 18000 1 %z} {1099173600 18000 0 %z} } |
Changes to library/tzdata/Asia/Baghdad.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Baghdad) { {-9223372036854775808 10660 0 LMT} {-2524532260 10656 0 BMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Baghdad) { {-9223372036854775808 10660 0 LMT} {-2524532260 10656 0 BMT} {-1641005856 10800 0 %z} {389048400 14400 0 %z} {402264000 10800 0 %z} {417906000 14400 1 %z} {433800000 10800 0 %z} {449614800 14400 1 %z} {465422400 10800 0 %z} {481150800 14400 1 %z} {496792800 10800 0 %z} {512517600 14400 1 %z} {528242400 10800 0 %z} {543967200 14400 1 %z} {559692000 10800 0 %z} {575416800 14400 1 %z} {591141600 10800 0 %z} {606866400 14400 1 %z} {622591200 10800 0 %z} {638316000 14400 1 %z} {654645600 10800 0 %z} {670464000 14400 1 %z} {686275200 10800 0 %z} {702086400 14400 1 %z} {717897600 10800 0 %z} {733622400 14400 1 %z} {749433600 10800 0 %z} {765158400 14400 1 %z} {780969600 10800 0 %z} {796694400 14400 1 %z} {812505600 10800 0 %z} {828316800 14400 1 %z} {844128000 10800 0 %z} {859852800 14400 1 %z} {875664000 10800 0 %z} {891388800 14400 1 %z} {907200000 10800 0 %z} {922924800 14400 1 %z} {938736000 10800 0 %z} {954547200 14400 1 %z} {970358400 10800 0 %z} {986083200 14400 1 %z} {1001894400 10800 0 %z} {1017619200 14400 1 %z} {1033430400 10800 0 %z} {1049155200 14400 1 %z} {1064966400 10800 0 %z} {1080777600 14400 1 %z} {1096588800 10800 0 %z} {1112313600 14400 1 %z} {1128124800 10800 0 %z} {1143849600 14400 1 %z} {1159660800 10800 0 %z} {1175385600 14400 1 %z} {1191196800 10800 0 %z} } |
Changes to library/tzdata/Asia/Baku.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Baku) { {-9223372036854775808 11964 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Baku) { {-9223372036854775808 11964 0 LMT} {-1441163964 10800 0 %z} {-405140400 14400 0 %z} {354916800 18000 1 %z} {370724400 14400 0 %z} {386452800 18000 1 %z} {402260400 14400 0 %z} {417988800 18000 1 %z} {433796400 14400 0 %z} {449611200 18000 1 %z} {465343200 14400 0 %z} {481068000 18000 1 %z} {496792800 14400 0 %z} {512517600 18000 1 %z} {528242400 14400 0 %z} {543967200 18000 1 %z} {559692000 14400 0 %z} {575416800 18000 1 %z} {591141600 14400 0 %z} {606866400 18000 1 %z} {622591200 14400 0 %z} {638316000 18000 1 %z} {654645600 14400 0 %z} {670370400 10800 0 %z} {670374000 14400 1 %z} {686098800 10800 0 %z} {701823600 14400 1 %z} {717548400 14400 0 %z} {820440000 14400 0 %z} {828234000 18000 1 %z} {846378000 14400 0 %z} {852062400 14400 0 %z} {859680000 18000 1 %z} {877824000 14400 0 %z} {891129600 18000 1 %z} {909273600 14400 0 %z} {922579200 18000 1 %z} {941328000 14400 0 %z} {954028800 18000 1 %z} {972777600 14400 0 %z} {985478400 18000 1 %z} {1004227200 14400 0 %z} {1017532800 18000 1 %z} {1035676800 14400 0 %z} {1048982400 18000 1 %z} {1067126400 14400 0 %z} {1080432000 18000 1 %z} {1099180800 14400 0 %z} {1111881600 18000 1 %z} {1130630400 14400 0 %z} {1143331200 18000 1 %z} {1162080000 14400 0 %z} {1174780800 18000 1 %z} {1193529600 14400 0 %z} {1206835200 18000 1 %z} {1224979200 14400 0 %z} {1238284800 18000 1 %z} {1256428800 14400 0 %z} {1269734400 18000 1 %z} {1288483200 14400 0 %z} {1301184000 18000 1 %z} {1319932800 14400 0 %z} {1332633600 18000 1 %z} {1351382400 14400 0 %z} {1364688000 18000 1 %z} {1382832000 14400 0 %z} {1396137600 18000 1 %z} {1414281600 14400 0 %z} {1427587200 18000 1 %z} {1445731200 14400 0 %z} } |
Changes to library/tzdata/Asia/Bangkok.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Bangkok) { {-9223372036854775808 24124 0 LMT} {-2840164924 24124 0 BMT} | | | 1 2 3 4 5 6 7 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Bangkok) { {-9223372036854775808 24124 0 LMT} {-2840164924 24124 0 BMT} {-1570084924 25200 0 %z} } |
Changes to library/tzdata/Asia/Barnaul.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Barnaul) { {-9223372036854775808 20100 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Barnaul) { {-9223372036854775808 20100 0 LMT} {-1579844100 21600 0 %z} {-1247551200 25200 0 %z} {354906000 28800 1 %z} {370713600 25200 0 %z} {386442000 28800 1 %z} {402249600 25200 0 %z} {417978000 28800 1 %z} {433785600 25200 0 %z} {449600400 28800 1 %z} {465332400 25200 0 %z} {481057200 28800 1 %z} {496782000 25200 0 %z} {512506800 28800 1 %z} {528231600 25200 0 %z} {543956400 28800 1 %z} {559681200 25200 0 %z} {575406000 28800 1 %z} {591130800 25200 0 %z} {606855600 28800 1 %z} {622580400 25200 0 %z} {638305200 28800 1 %z} {654634800 25200 0 %z} {670359600 21600 0 %z} {670363200 25200 1 %z} {686088000 21600 0 %z} {695764800 25200 0 %z} {701809200 28800 1 %z} {717534000 25200 0 %z} {733258800 28800 1 %z} {748983600 25200 0 %z} {764708400 28800 1 %z} {780433200 25200 0 %z} {796158000 28800 1 %z} {801594000 25200 0 %z} {811886400 21600 0 %z} {828216000 25200 1 %z} {846360000 21600 0 %z} {859665600 25200 1 %z} {877809600 21600 0 %z} {891115200 25200 1 %z} {909259200 21600 0 %z} {922564800 25200 1 %z} {941313600 21600 0 %z} {954014400 25200 1 %z} {972763200 21600 0 %z} {985464000 25200 1 %z} {1004212800 21600 0 %z} {1017518400 25200 1 %z} {1035662400 21600 0 %z} {1048968000 25200 1 %z} {1067112000 21600 0 %z} {1080417600 25200 1 %z} {1099166400 21600 0 %z} {1111867200 25200 1 %z} {1130616000 21600 0 %z} {1143316800 25200 1 %z} {1162065600 21600 0 %z} {1174766400 25200 1 %z} {1193515200 21600 0 %z} {1206820800 25200 1 %z} {1224964800 21600 0 %z} {1238270400 25200 1 %z} {1256414400 21600 0 %z} {1269720000 25200 1 %z} {1288468800 21600 0 %z} {1301169600 25200 0 %z} {1414263600 21600 0 %z} {1459022400 25200 0 %z} } |
Changes to library/tzdata/Asia/Bishkek.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Bishkek) { {-9223372036854775808 17904 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Bishkek) { {-9223372036854775808 17904 0 LMT} {-1441169904 18000 0 %z} {-1247547600 21600 0 %z} {354909600 25200 1 %z} {370717200 21600 0 %z} {386445600 25200 1 %z} {402253200 21600 0 %z} {417981600 25200 1 %z} {433789200 21600 0 %z} {449604000 25200 1 %z} {465336000 21600 0 %z} {481060800 25200 1 %z} {496785600 21600 0 %z} {512510400 25200 1 %z} {528235200 21600 0 %z} {543960000 25200 1 %z} {559684800 21600 0 %z} {575409600 25200 1 %z} {591134400 21600 0 %z} {606859200 25200 1 %z} {622584000 21600 0 %z} {638308800 25200 1 %z} {654638400 21600 0 %z} {670363200 18000 0 %z} {670366800 21600 1 %z} {683586000 18000 0 %z} {703018800 21600 1 %z} {717530400 18000 0 %z} {734468400 21600 1 %z} {748980000 18000 0 %z} {765918000 21600 1 %z} {780429600 18000 0 %z} {797367600 21600 1 %z} {811879200 18000 0 %z} {828817200 21600 1 %z} {843933600 18000 0 %z} {859671000 21600 1 %z} {877811400 18000 0 %z} {891120600 21600 1 %z} {909261000 18000 0 %z} {922570200 21600 1 %z} {941315400 18000 0 %z} {954019800 21600 1 %z} {972765000 18000 0 %z} {985469400 21600 1 %z} {1004214600 18000 0 %z} {1017523800 21600 1 %z} {1035664200 18000 0 %z} {1048973400 21600 1 %z} {1067113800 18000 0 %z} {1080423000 21600 1 %z} {1099168200 18000 0 %z} {1111872600 21600 1 %z} {1123783200 21600 0 %z} } |
Changes to library/tzdata/Asia/Chita.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Chita) { {-9223372036854775808 27232 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Chita) { {-9223372036854775808 27232 0 LMT} {-1579419232 28800 0 %z} {-1247558400 32400 0 %z} {354898800 36000 1 %z} {370706400 32400 0 %z} {386434800 36000 1 %z} {402242400 32400 0 %z} {417970800 36000 1 %z} {433778400 32400 0 %z} {449593200 36000 1 %z} {465325200 32400 0 %z} {481050000 36000 1 %z} {496774800 32400 0 %z} {512499600 36000 1 %z} {528224400 32400 0 %z} {543949200 36000 1 %z} {559674000 32400 0 %z} {575398800 36000 1 %z} {591123600 32400 0 %z} {606848400 36000 1 %z} {622573200 32400 0 %z} {638298000 36000 1 %z} {654627600 32400 0 %z} {670352400 28800 0 %z} {670356000 32400 1 %z} {686080800 28800 0 %z} {695757600 32400 0 %z} {701802000 36000 1 %z} {717526800 32400 0 %z} {733251600 36000 1 %z} {748976400 32400 0 %z} {764701200 36000 1 %z} {780426000 32400 0 %z} {796150800 36000 1 %z} {811875600 32400 0 %z} {828205200 36000 1 %z} {846349200 32400 0 %z} {859654800 36000 1 %z} {877798800 32400 0 %z} {891104400 36000 1 %z} {909248400 32400 0 %z} {922554000 36000 1 %z} {941302800 32400 0 %z} {954003600 36000 1 %z} {972752400 32400 0 %z} {985453200 36000 1 %z} {1004202000 32400 0 %z} {1017507600 36000 1 %z} {1035651600 32400 0 %z} {1048957200 36000 1 %z} {1067101200 32400 0 %z} {1080406800 36000 1 %z} {1099155600 32400 0 %z} {1111856400 36000 1 %z} {1130605200 32400 0 %z} {1143306000 36000 1 %z} {1162054800 32400 0 %z} {1174755600 36000 1 %z} {1193504400 32400 0 %z} {1206810000 36000 1 %z} {1224954000 32400 0 %z} {1238259600 36000 1 %z} {1256403600 32400 0 %z} {1269709200 36000 1 %z} {1288458000 32400 0 %z} {1301158800 36000 0 %z} {1414252800 28800 0 %z} {1459015200 32400 0 %z} } |
Changes to library/tzdata/Asia/Choibalsan.
1 | # created by tools/tclZIC.tcl - do not edit | > > | | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit if {![info exists TZData(Asia/Ulaanbaatar)]} { LoadTimeZoneFile Asia/Ulaanbaatar } set TZData(:Asia/Choibalsan) $TZData(:Asia/Ulaanbaatar) |
Changes to library/tzdata/Asia/Colombo.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Colombo) { {-9223372036854775808 19164 0 LMT} {-2840159964 19172 0 MMT} | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Colombo) { {-9223372036854775808 19164 0 LMT} {-2840159964 19172 0 MMT} {-2019705572 19800 0 %z} {-883287000 21600 1 %z} {-862639200 23400 1 %z} {-764051400 19800 0 %z} {832962600 23400 0 %z} {846266400 21600 0 %z} {1145039400 19800 0 %z} } |
Changes to library/tzdata/Asia/Damascus.
︙ | ︙ | |||
118 119 120 121 122 123 124 | {1553810400 10800 1 EEST} {1571950800 7200 0 EET} {1585260000 10800 1 EEST} {1604005200 7200 0 EET} {1616709600 10800 1 EEST} {1635454800 7200 0 EET} {1648159200 10800 1 EEST} | | | 118 119 120 121 122 123 124 125 126 | {1553810400 10800 1 EEST} {1571950800 7200 0 EET} {1585260000 10800 1 EEST} {1604005200 7200 0 EET} {1616709600 10800 1 EEST} {1635454800 7200 0 EET} {1648159200 10800 1 EEST} {1666908000 10800 0 %z} } |
Changes to library/tzdata/Asia/Dhaka.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Dhaka) { {-9223372036854775808 21700 0 LMT} {-2524543300 21200 0 HMT} | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Dhaka) { {-9223372036854775808 21700 0 LMT} {-2524543300 21200 0 HMT} {-891582800 23400 0 %z} {-872058600 19800 0 %z} {-862637400 23400 0 %z} {-576138600 21600 0 %z} {1230746400 21600 0 %z} {1245430800 25200 1 %z} {1262278800 21600 0 %z} } |
Changes to library/tzdata/Asia/Dili.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Dili) { {-9223372036854775808 30140 0 LMT} | | | | | | 1 2 3 4 5 6 7 8 9 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Dili) { {-9223372036854775808 30140 0 LMT} {-1830412800 28800 0 %z} {-879152400 32400 0 %z} {199897200 28800 0 %z} {969120000 32400 0 %z} } |
Changes to library/tzdata/Asia/Dubai.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Dubai) { {-9223372036854775808 13272 0 LMT} | | | 1 2 3 4 5 6 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Dubai) { {-9223372036854775808 13272 0 LMT} {-1577936472 14400 0 %z} } |
Changes to library/tzdata/Asia/Dushanbe.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Dushanbe) { {-9223372036854775808 16512 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Dushanbe) { {-9223372036854775808 16512 0 LMT} {-1441168512 18000 0 %z} {-1247547600 21600 0 %z} {354909600 25200 1 %z} {370717200 21600 0 %z} {386445600 25200 1 %z} {402253200 21600 0 %z} {417981600 25200 1 %z} {433789200 21600 0 %z} {449604000 25200 1 %z} {465336000 21600 0 %z} {481060800 25200 1 %z} {496785600 21600 0 %z} {512510400 25200 1 %z} {528235200 21600 0 %z} {543960000 25200 1 %z} {559684800 21600 0 %z} {575409600 25200 1 %z} {591134400 21600 0 %z} {606859200 25200 1 %z} {622584000 21600 0 %z} {638308800 25200 1 %z} {654638400 21600 0 %z} {670363200 21600 1 %z} {684363600 18000 0 %z} } |
Changes to library/tzdata/Asia/Famagusta.
︙ | ︙ | |||
83 84 85 86 87 88 89 | {1364691600 10800 1 EEST} {1382835600 7200 0 EET} {1396141200 10800 1 EEST} {1414285200 7200 0 EET} {1427590800 10800 1 EEST} {1445734800 7200 0 EET} {1459040400 10800 1 EEST} | | | 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | {1364691600 10800 1 EEST} {1382835600 7200 0 EET} {1396141200 10800 1 EEST} {1414285200 7200 0 EET} {1427590800 10800 1 EEST} {1445734800 7200 0 EET} {1459040400 10800 1 EEST} {1473285600 10800 0 %z} {1509238800 7200 0 EET} {1521939600 10800 1 EEST} {1540688400 7200 0 EET} {1553994000 10800 1 EEST} {1572138000 7200 0 EET} {1585443600 10800 1 EEST} {1603587600 7200 0 EET} |
︙ | ︙ |
Changes to library/tzdata/Asia/Ho_Chi_Minh.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Ho_Chi_Minh) { {-9223372036854775808 25590 0 LMT} {-2004073590 25590 0 PLMT} | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Ho_Chi_Minh) { {-9223372036854775808 25590 0 LMT} {-2004073590 25590 0 PLMT} {-1851577590 25200 0 %z} {-852105600 28800 0 %z} {-782643600 32400 0 %z} {-767869200 25200 0 %z} {-718095600 28800 0 %z} {-457772400 25200 0 %z} {-315648000 28800 0 %z} {171820800 25200 0 %z} } |
Changes to library/tzdata/Asia/Hovd.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Hovd) { {-9223372036854775808 21996 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Hovd) { {-9223372036854775808 21996 0 LMT} {-2032927596 21600 0 %z} {252439200 25200 0 %z} {417978000 28800 1 %z} {433785600 25200 0 %z} {449600400 28800 1 %z} {465321600 25200 0 %z} {481050000 28800 1 %z} {496771200 25200 0 %z} {512499600 28800 1 %z} {528220800 25200 0 %z} {543949200 28800 1 %z} {559670400 25200 0 %z} {575398800 28800 1 %z} {591120000 25200 0 %z} {606848400 28800 1 %z} {622569600 25200 0 %z} {638298000 28800 1 %z} {654624000 25200 0 %z} {670352400 28800 1 %z} {686073600 25200 0 %z} {701802000 28800 1 %z} {717523200 25200 0 %z} {733251600 28800 1 %z} {748972800 25200 0 %z} {764701200 28800 1 %z} {780422400 25200 0 %z} {796150800 28800 1 %z} {811872000 25200 0 %z} {828205200 28800 1 %z} {843926400 25200 0 %z} {859654800 28800 1 %z} {875376000 25200 0 %z} {891104400 28800 1 %z} {906825600 25200 0 %z} {988398000 28800 1 %z} {1001700000 25200 0 %z} {1017428400 28800 1 %z} {1033149600 25200 0 %z} {1048878000 28800 1 %z} {1064599200 25200 0 %z} {1080327600 28800 1 %z} {1096048800 25200 0 %z} {1111777200 28800 1 %z} {1127498400 25200 0 %z} {1143226800 28800 1 %z} {1159552800 25200 0 %z} {1427482800 28800 1 %z} {1443196800 25200 0 %z} {1458932400 28800 1 %z} {1474646400 25200 0 %z} } |
Changes to library/tzdata/Asia/Irkutsk.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Irkutsk) { {-9223372036854775808 25025 0 LMT} {-2840165825 25025 0 IMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Irkutsk) { {-9223372036854775808 25025 0 LMT} {-2840165825 25025 0 IMT} {-1575874625 25200 0 %z} {-1247554800 28800 0 %z} {354902400 32400 1 %z} {370710000 28800 0 %z} {386438400 32400 1 %z} {402246000 28800 0 %z} {417974400 32400 1 %z} {433782000 28800 0 %z} {449596800 32400 1 %z} {465328800 28800 0 %z} {481053600 32400 1 %z} {496778400 28800 0 %z} {512503200 32400 1 %z} {528228000 28800 0 %z} {543952800 32400 1 %z} {559677600 28800 0 %z} {575402400 32400 1 %z} {591127200 28800 0 %z} {606852000 32400 1 %z} {622576800 28800 0 %z} {638301600 32400 1 %z} {654631200 28800 0 %z} {670356000 25200 0 %z} {670359600 28800 1 %z} {686084400 25200 0 %z} {695761200 28800 0 %z} {701805600 32400 1 %z} {717530400 28800 0 %z} {733255200 32400 1 %z} {748980000 28800 0 %z} {764704800 32400 1 %z} {780429600 28800 0 %z} {796154400 32400 1 %z} {811879200 28800 0 %z} {828208800 32400 1 %z} {846352800 28800 0 %z} {859658400 32400 1 %z} {877802400 28800 0 %z} {891108000 32400 1 %z} {909252000 28800 0 %z} {922557600 32400 1 %z} {941306400 28800 0 %z} {954007200 32400 1 %z} {972756000 28800 0 %z} {985456800 32400 1 %z} {1004205600 28800 0 %z} {1017511200 32400 1 %z} {1035655200 28800 0 %z} {1048960800 32400 1 %z} {1067104800 28800 0 %z} {1080410400 32400 1 %z} {1099159200 28800 0 %z} {1111860000 32400 1 %z} {1130608800 28800 0 %z} {1143309600 32400 1 %z} {1162058400 28800 0 %z} {1174759200 32400 1 %z} {1193508000 28800 0 %z} {1206813600 32400 1 %z} {1224957600 28800 0 %z} {1238263200 32400 1 %z} {1256407200 28800 0 %z} {1269712800 32400 1 %z} {1288461600 28800 0 %z} {1301162400 32400 0 %z} {1414256400 28800 0 %z} } |
Changes to library/tzdata/Asia/Jakarta.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Jakarta) { {-9223372036854775808 25632 0 LMT} {-3231299232 25632 0 BMT} | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Jakarta) { {-9223372036854775808 25632 0 LMT} {-3231299232 25632 0 BMT} {-1451719200 26400 0 %z} {-1172906400 27000 0 %z} {-876641400 32400 0 %z} {-766054800 27000 0 %z} {-683883000 28800 0 %z} {-620812800 27000 0 %z} {-189415800 25200 0 WIB} } |
Changes to library/tzdata/Asia/Jayapura.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Jayapura) { {-9223372036854775808 33768 0 LMT} | | | | 1 2 3 4 5 6 7 8 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Jayapura) { {-9223372036854775808 33768 0 LMT} {-1172913768 32400 0 %z} {-799491600 34200 0 %z} {-189423000 32400 0 WIT} } |
Changes to library/tzdata/Asia/Kabul.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Kabul) { {-9223372036854775808 16608 0 LMT} | | | | 1 2 3 4 5 6 7 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Kabul) { {-9223372036854775808 16608 0 LMT} {-2524538208 14400 0 %z} {-788932800 16200 0 %z} } |
Changes to library/tzdata/Asia/Kamchatka.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Kamchatka) { {-9223372036854775808 38076 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Kamchatka) { {-9223372036854775808 38076 0 LMT} {-1487759676 39600 0 %z} {-1247569200 43200 0 %z} {354888000 46800 1 %z} {370695600 43200 0 %z} {386424000 46800 1 %z} {402231600 43200 0 %z} {417960000 46800 1 %z} {433767600 43200 0 %z} {449582400 46800 1 %z} {465314400 43200 0 %z} {481039200 46800 1 %z} {496764000 43200 0 %z} {512488800 46800 1 %z} {528213600 43200 0 %z} {543938400 46800 1 %z} {559663200 43200 0 %z} {575388000 46800 1 %z} {591112800 43200 0 %z} {606837600 46800 1 %z} {622562400 43200 0 %z} {638287200 46800 1 %z} {654616800 43200 0 %z} {670341600 39600 0 %z} {670345200 43200 1 %z} {686070000 39600 0 %z} {695746800 43200 0 %z} {701791200 46800 1 %z} {717516000 43200 0 %z} {733240800 46800 1 %z} {748965600 43200 0 %z} {764690400 46800 1 %z} {780415200 43200 0 %z} {796140000 46800 1 %z} {811864800 43200 0 %z} {828194400 46800 1 %z} {846338400 43200 0 %z} {859644000 46800 1 %z} {877788000 43200 0 %z} {891093600 46800 1 %z} {909237600 43200 0 %z} {922543200 46800 1 %z} {941292000 43200 0 %z} {953992800 46800 1 %z} {972741600 43200 0 %z} {985442400 46800 1 %z} {1004191200 43200 0 %z} {1017496800 46800 1 %z} {1035640800 43200 0 %z} {1048946400 46800 1 %z} {1067090400 43200 0 %z} {1080396000 46800 1 %z} {1099144800 43200 0 %z} {1111845600 46800 1 %z} {1130594400 43200 0 %z} {1143295200 46800 1 %z} {1162044000 43200 0 %z} {1174744800 46800 1 %z} {1193493600 43200 0 %z} {1206799200 46800 1 %z} {1224943200 43200 0 %z} {1238248800 46800 1 %z} {1256392800 43200 0 %z} {1269698400 39600 0 %z} {1269702000 43200 1 %z} {1288450800 39600 0 %z} {1301151600 43200 0 %z} } |
Changes to library/tzdata/Asia/Karachi.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Karachi) { {-9223372036854775808 16092 0 LMT} | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Karachi) { {-9223372036854775808 16092 0 LMT} {-1988166492 19800 0 %z} {-862637400 23400 1 %z} {-764145000 19800 0 %z} {-576135000 18000 0 %z} {38775600 18000 0 PKT} {1018119600 21600 1 PKST} {1033840800 18000 0 PKT} {1212260400 21600 1 PKST} {1225476000 18000 0 PKT} {1239735600 21600 1 PKST} {1257012000 18000 0 PKT} |
︙ | ︙ |
Changes to library/tzdata/Asia/Kathmandu.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Kathmandu) { {-9223372036854775808 20476 0 LMT} | | | | 1 2 3 4 5 6 7 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Kathmandu) { {-9223372036854775808 20476 0 LMT} {-1577943676 19800 0 %z} {504901800 20700 0 %z} } |
Changes to library/tzdata/Asia/Khandyga.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Khandyga) { {-9223372036854775808 32533 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Khandyga) { {-9223372036854775808 32533 0 LMT} {-1579424533 28800 0 %z} {-1247558400 32400 0 %z} {354898800 36000 1 %z} {370706400 32400 0 %z} {386434800 36000 1 %z} {402242400 32400 0 %z} {417970800 36000 1 %z} {433778400 32400 0 %z} {449593200 36000 1 %z} {465325200 32400 0 %z} {481050000 36000 1 %z} {496774800 32400 0 %z} {512499600 36000 1 %z} {528224400 32400 0 %z} {543949200 36000 1 %z} {559674000 32400 0 %z} {575398800 36000 1 %z} {591123600 32400 0 %z} {606848400 36000 1 %z} {622573200 32400 0 %z} {638298000 36000 1 %z} {654627600 32400 0 %z} {670352400 28800 0 %z} {670356000 32400 1 %z} {686080800 28800 0 %z} {695757600 32400 0 %z} {701802000 36000 1 %z} {717526800 32400 0 %z} {733251600 36000 1 %z} {748976400 32400 0 %z} {764701200 36000 1 %z} {780426000 32400 0 %z} {796150800 36000 1 %z} {811875600 32400 0 %z} {828205200 36000 1 %z} {846349200 32400 0 %z} {859654800 36000 1 %z} {877798800 32400 0 %z} {891104400 36000 1 %z} {909248400 32400 0 %z} {922554000 36000 1 %z} {941302800 32400 0 %z} {954003600 36000 1 %z} {972752400 32400 0 %z} {985453200 36000 1 %z} {1004202000 32400 0 %z} {1017507600 36000 1 %z} {1035651600 32400 0 %z} {1048957200 36000 1 %z} {1067101200 32400 0 %z} {1072882800 36000 0 %z} {1080403200 39600 1 %z} {1099152000 36000 0 %z} {1111852800 39600 1 %z} {1130601600 36000 0 %z} {1143302400 39600 1 %z} {1162051200 36000 0 %z} {1174752000 39600 1 %z} {1193500800 36000 0 %z} {1206806400 39600 1 %z} {1224950400 36000 0 %z} {1238256000 39600 1 %z} {1256400000 36000 0 %z} {1269705600 39600 1 %z} {1288454400 36000 0 %z} {1301155200 39600 0 %z} {1315832400 36000 0 %z} {1414252800 32400 0 %z} } |
Changes to library/tzdata/Asia/Kolkata.
1 2 3 4 5 6 7 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Kolkata) { {-9223372036854775808 21208 0 LMT} {-3645237208 21200 0 HMT} {-3155694800 19270 0 MMT} {-2019705670 19800 0 IST} | | | | 1 2 3 4 5 6 7 8 9 10 11 12 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Kolkata) { {-9223372036854775808 21208 0 LMT} {-3645237208 21200 0 HMT} {-3155694800 19270 0 MMT} {-2019705670 19800 0 IST} {-891581400 23400 1 %z} {-872058600 19800 0 IST} {-862637400 23400 1 %z} {-764145000 19800 0 IST} } |
Changes to library/tzdata/Asia/Krasnoyarsk.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Krasnoyarsk) { {-9223372036854775808 22286 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Krasnoyarsk) { {-9223372036854775808 22286 0 LMT} {-1577513486 21600 0 %z} {-1247551200 25200 0 %z} {354906000 28800 1 %z} {370713600 25200 0 %z} {386442000 28800 1 %z} {402249600 25200 0 %z} {417978000 28800 1 %z} {433785600 25200 0 %z} {449600400 28800 1 %z} {465332400 25200 0 %z} {481057200 28800 1 %z} {496782000 25200 0 %z} {512506800 28800 1 %z} {528231600 25200 0 %z} {543956400 28800 1 %z} {559681200 25200 0 %z} {575406000 28800 1 %z} {591130800 25200 0 %z} {606855600 28800 1 %z} {622580400 25200 0 %z} {638305200 28800 1 %z} {654634800 25200 0 %z} {670359600 21600 0 %z} {670363200 25200 1 %z} {686088000 21600 0 %z} {695764800 25200 0 %z} {701809200 28800 1 %z} {717534000 25200 0 %z} {733258800 28800 1 %z} {748983600 25200 0 %z} {764708400 28800 1 %z} {780433200 25200 0 %z} {796158000 28800 1 %z} {811882800 25200 0 %z} {828212400 28800 1 %z} {846356400 25200 0 %z} {859662000 28800 1 %z} {877806000 25200 0 %z} {891111600 28800 1 %z} {909255600 25200 0 %z} {922561200 28800 1 %z} {941310000 25200 0 %z} {954010800 28800 1 %z} {972759600 25200 0 %z} {985460400 28800 1 %z} {1004209200 25200 0 %z} {1017514800 28800 1 %z} {1035658800 25200 0 %z} {1048964400 28800 1 %z} {1067108400 25200 0 %z} {1080414000 28800 1 %z} {1099162800 25200 0 %z} {1111863600 28800 1 %z} {1130612400 25200 0 %z} {1143313200 28800 1 %z} {1162062000 25200 0 %z} {1174762800 28800 1 %z} {1193511600 25200 0 %z} {1206817200 28800 1 %z} {1224961200 25200 0 %z} {1238266800 28800 1 %z} {1256410800 25200 0 %z} {1269716400 28800 1 %z} {1288465200 25200 0 %z} {1301166000 28800 0 %z} {1414260000 25200 0 %z} } |
Changes to library/tzdata/Asia/Kuching.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Kuching) { {-9223372036854775808 26480 0 LMT} | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Kuching) { {-9223372036854775808 26480 0 LMT} {-1383463280 27000 0 %z} {-1167636600 28800 0 %z} {-1082448000 30000 1 %z} {-1074586800 28800 0 %z} {-1050825600 30000 1 %z} {-1042964400 28800 0 %z} {-1019289600 30000 1 %z} {-1011428400 28800 0 %z} {-987753600 30000 1 %z} {-979892400 28800 0 %z} {-956217600 30000 1 %z} {-948356400 28800 0 %z} {-924595200 30000 1 %z} {-916734000 28800 0 %z} {-893059200 30000 1 %z} {-885198000 28800 0 %z} {-879667200 32400 0 %z} {-767005200 28800 0 %z} } |
Changes to library/tzdata/Asia/Macau.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Macau) { {-9223372036854775808 27250 0 LMT} {-2056692850 28800 0 CST} | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Macau) { {-9223372036854775808 27250 0 LMT} {-2056692850 28800 0 CST} {-884509200 32400 0 %z} {-873280800 36000 1 %z} {-855918000 32400 0 %z} {-841744800 36000 1 %z} {-828529200 32400 0 %z} {-765363600 28800 0 CT} {-747046800 32400 1 CDT} {-733827600 28800 0 CST} {-716461200 32400 1 CDT} {-697021200 28800 0 CST} {-683715600 32400 1 CDT} {-667990800 28800 0 CST} |
︙ | ︙ |
Changes to library/tzdata/Asia/Magadan.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Magadan) { {-9223372036854775808 36192 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Magadan) { {-9223372036854775808 36192 0 LMT} {-1441188192 36000 0 %z} {-1247565600 39600 0 %z} {354891600 43200 1 %z} {370699200 39600 0 %z} {386427600 43200 1 %z} {402235200 39600 0 %z} {417963600 43200 1 %z} {433771200 39600 0 %z} {449586000 43200 1 %z} {465318000 39600 0 %z} {481042800 43200 1 %z} {496767600 39600 0 %z} {512492400 43200 1 %z} {528217200 39600 0 %z} {543942000 43200 1 %z} {559666800 39600 0 %z} {575391600 43200 1 %z} {591116400 39600 0 %z} {606841200 43200 1 %z} {622566000 39600 0 %z} {638290800 43200 1 %z} {654620400 39600 0 %z} {670345200 36000 0 %z} {670348800 39600 1 %z} {686073600 36000 0 %z} {695750400 39600 0 %z} {701794800 43200 1 %z} {717519600 39600 0 %z} {733244400 43200 1 %z} {748969200 39600 0 %z} {764694000 43200 1 %z} {780418800 39600 0 %z} {796143600 43200 1 %z} {811868400 39600 0 %z} {828198000 43200 1 %z} {846342000 39600 0 %z} {859647600 43200 1 %z} {877791600 39600 0 %z} {891097200 43200 1 %z} {909241200 39600 0 %z} {922546800 43200 1 %z} {941295600 39600 0 %z} {953996400 43200 1 %z} {972745200 39600 0 %z} {985446000 43200 1 %z} {1004194800 39600 0 %z} {1017500400 43200 1 %z} {1035644400 39600 0 %z} {1048950000 43200 1 %z} {1067094000 39600 0 %z} {1080399600 43200 1 %z} {1099148400 39600 0 %z} {1111849200 43200 1 %z} {1130598000 39600 0 %z} {1143298800 43200 1 %z} {1162047600 39600 0 %z} {1174748400 43200 1 %z} {1193497200 39600 0 %z} {1206802800 43200 1 %z} {1224946800 39600 0 %z} {1238252400 43200 1 %z} {1256396400 39600 0 %z} {1269702000 43200 1 %z} {1288450800 39600 0 %z} {1301151600 43200 0 %z} {1414245600 36000 0 %z} {1461427200 39600 0 %z} } |
Changes to library/tzdata/Asia/Makassar.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Makassar) { {-9223372036854775808 28656 0 LMT} {-1577951856 28656 0 MMT} | | | | 1 2 3 4 5 6 7 8 9 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Makassar) { {-9223372036854775808 28656 0 LMT} {-1577951856 28656 0 MMT} {-1172908656 28800 0 %z} {-880272000 32400 0 %z} {-766054800 28800 0 WITA} } |
Changes to library/tzdata/Asia/Novokuznetsk.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Novokuznetsk) { {-9223372036854775808 20928 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Novokuznetsk) { {-9223372036854775808 20928 0 LMT} {-1441259328 21600 0 %z} {-1247551200 25200 0 %z} {354906000 28800 1 %z} {370713600 25200 0 %z} {386442000 28800 1 %z} {402249600 25200 0 %z} {417978000 28800 1 %z} {433785600 25200 0 %z} {449600400 28800 1 %z} {465332400 25200 0 %z} {481057200 28800 1 %z} {496782000 25200 0 %z} {512506800 28800 1 %z} {528231600 25200 0 %z} {543956400 28800 1 %z} {559681200 25200 0 %z} {575406000 28800 1 %z} {591130800 25200 0 %z} {606855600 28800 1 %z} {622580400 25200 0 %z} {638305200 28800 1 %z} {654634800 25200 0 %z} {670359600 21600 0 %z} {670363200 25200 1 %z} {686088000 21600 0 %z} {695764800 25200 0 %z} {701809200 28800 1 %z} {717534000 25200 0 %z} {733258800 28800 1 %z} {748983600 25200 0 %z} {764708400 28800 1 %z} {780433200 25200 0 %z} {796158000 28800 1 %z} {811882800 25200 0 %z} {828212400 28800 1 %z} {846356400 25200 0 %z} {859662000 28800 1 %z} {877806000 25200 0 %z} {891111600 28800 1 %z} {909255600 25200 0 %z} {922561200 28800 1 %z} {941310000 25200 0 %z} {954010800 28800 1 %z} {972759600 25200 0 %z} {985460400 28800 1 %z} {1004209200 25200 0 %z} {1017514800 28800 1 %z} {1035658800 25200 0 %z} {1048964400 28800 1 %z} {1067108400 25200 0 %z} {1080414000 28800 1 %z} {1099162800 25200 0 %z} {1111863600 28800 1 %z} {1130612400 25200 0 %z} {1143313200 28800 1 %z} {1162062000 25200 0 %z} {1174762800 28800 1 %z} {1193511600 25200 0 %z} {1206817200 28800 1 %z} {1224961200 25200 0 %z} {1238266800 28800 1 %z} {1256410800 25200 0 %z} {1269716400 21600 0 %z} {1269720000 25200 1 %z} {1288468800 21600 0 %z} {1301169600 25200 0 %z} } |
Changes to library/tzdata/Asia/Novosibirsk.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Novosibirsk) { {-9223372036854775808 19900 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Novosibirsk) { {-9223372036854775808 19900 0 LMT} {-1579476700 21600 0 %z} {-1247551200 25200 0 %z} {354906000 28800 1 %z} {370713600 25200 0 %z} {386442000 28800 1 %z} {402249600 25200 0 %z} {417978000 28800 1 %z} {433785600 25200 0 %z} {449600400 28800 1 %z} {465332400 25200 0 %z} {481057200 28800 1 %z} {496782000 25200 0 %z} {512506800 28800 1 %z} {528231600 25200 0 %z} {543956400 28800 1 %z} {559681200 25200 0 %z} {575406000 28800 1 %z} {591130800 25200 0 %z} {606855600 28800 1 %z} {622580400 25200 0 %z} {638305200 28800 1 %z} {654634800 25200 0 %z} {670359600 21600 0 %z} {670363200 25200 1 %z} {686088000 21600 0 %z} {695764800 25200 0 %z} {701809200 28800 1 %z} {717534000 25200 0 %z} {733258800 28800 1 %z} {738090000 25200 0 %z} {748987200 21600 0 %z} {764712000 25200 1 %z} {780436800 21600 0 %z} {796161600 25200 1 %z} {811886400 21600 0 %z} {828216000 25200 1 %z} {846360000 21600 0 %z} {859665600 25200 1 %z} {877809600 21600 0 %z} {891115200 25200 1 %z} {909259200 21600 0 %z} {922564800 25200 1 %z} {941313600 21600 0 %z} {954014400 25200 1 %z} {972763200 21600 0 %z} {985464000 25200 1 %z} {1004212800 21600 0 %z} {1017518400 25200 1 %z} {1035662400 21600 0 %z} {1048968000 25200 1 %z} {1067112000 21600 0 %z} {1080417600 25200 1 %z} {1099166400 21600 0 %z} {1111867200 25200 1 %z} {1130616000 21600 0 %z} {1143316800 25200 1 %z} {1162065600 21600 0 %z} {1174766400 25200 1 %z} {1193515200 21600 0 %z} {1206820800 25200 1 %z} {1224964800 21600 0 %z} {1238270400 25200 1 %z} {1256414400 21600 0 %z} {1269720000 25200 1 %z} {1288468800 21600 0 %z} {1301169600 25200 0 %z} {1414263600 21600 0 %z} {1469304000 25200 0 %z} } |
Changes to library/tzdata/Asia/Omsk.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Omsk) { {-9223372036854775808 17610 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Omsk) { {-9223372036854775808 17610 0 LMT} {-1582088010 18000 0 %z} {-1247547600 21600 0 %z} {354909600 25200 1 %z} {370717200 21600 0 %z} {386445600 25200 1 %z} {402253200 21600 0 %z} {417981600 25200 1 %z} {433789200 21600 0 %z} {449604000 25200 1 %z} {465336000 21600 0 %z} {481060800 25200 1 %z} {496785600 21600 0 %z} {512510400 25200 1 %z} {528235200 21600 0 %z} {543960000 25200 1 %z} {559684800 21600 0 %z} {575409600 25200 1 %z} {591134400 21600 0 %z} {606859200 25200 1 %z} {622584000 21600 0 %z} {638308800 25200 1 %z} {654638400 21600 0 %z} {670363200 18000 0 %z} {670366800 21600 1 %z} {686091600 18000 0 %z} {695768400 21600 0 %z} {701812800 25200 1 %z} {717537600 21600 0 %z} {733262400 25200 1 %z} {748987200 21600 0 %z} {764712000 25200 1 %z} {780436800 21600 0 %z} {796161600 25200 1 %z} {811886400 21600 0 %z} {828216000 25200 1 %z} {846360000 21600 0 %z} {859665600 25200 1 %z} {877809600 21600 0 %z} {891115200 25200 1 %z} {909259200 21600 0 %z} {922564800 25200 1 %z} {941313600 21600 0 %z} {954014400 25200 1 %z} {972763200 21600 0 %z} {985464000 25200 1 %z} {1004212800 21600 0 %z} {1017518400 25200 1 %z} {1035662400 21600 0 %z} {1048968000 25200 1 %z} {1067112000 21600 0 %z} {1080417600 25200 1 %z} {1099166400 21600 0 %z} {1111867200 25200 1 %z} {1130616000 21600 0 %z} {1143316800 25200 1 %z} {1162065600 21600 0 %z} {1174766400 25200 1 %z} {1193515200 21600 0 %z} {1206820800 25200 1 %z} {1224964800 21600 0 %z} {1238270400 25200 1 %z} {1256414400 21600 0 %z} {1269720000 25200 1 %z} {1288468800 21600 0 %z} {1301169600 25200 0 %z} {1414263600 21600 0 %z} } |
Changes to library/tzdata/Asia/Oral.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Oral) { {-9223372036854775808 12324 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Oral) { {-9223372036854775808 12324 0 LMT} {-1441164324 10800 0 %z} {-1247540400 18000 0 %z} {354913200 21600 1 %z} {370720800 21600 0 %z} {386445600 18000 0 %z} {386449200 21600 1 %z} {402256800 18000 0 %z} {417985200 21600 1 %z} {433792800 18000 0 %z} {449607600 21600 1 %z} {465339600 18000 0 %z} {481064400 21600 1 %z} {496789200 18000 0 %z} {512514000 21600 1 %z} {528238800 18000 0 %z} {543963600 21600 1 %z} {559688400 18000 0 %z} {575413200 21600 1 %z} {591138000 18000 0 %z} {606862800 14400 0 %z} {606866400 18000 1 %z} {622591200 14400 0 %z} {638316000 18000 1 %z} {654645600 14400 0 %z} {670370400 18000 1 %z} {686095200 14400 0 %z} {701816400 14400 0 %z} {701820000 18000 1 %z} {717544800 14400 0 %z} {733269600 18000 1 %z} {748994400 14400 0 %z} {764719200 18000 1 %z} {780444000 14400 0 %z} {796168800 18000 1 %z} {811893600 14400 0 %z} {828223200 18000 1 %z} {846367200 14400 0 %z} {859672800 18000 1 %z} {877816800 14400 0 %z} {891122400 18000 1 %z} {909266400 14400 0 %z} {922572000 18000 1 %z} {941320800 14400 0 %z} {954021600 18000 1 %z} {972770400 14400 0 %z} {985471200 18000 1 %z} {1004220000 14400 0 %z} {1017525600 18000 1 %z} {1035669600 14400 0 %z} {1048975200 18000 1 %z} {1067119200 14400 0 %z} {1080424800 18000 1 %z} {1099173600 18000 0 %z} } |
Changes to library/tzdata/Asia/Pontianak.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Pontianak) { {-9223372036854775808 26240 0 LMT} {-1946186240 26240 0 PMT} | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Pontianak) { {-9223372036854775808 26240 0 LMT} {-1946186240 26240 0 PMT} {-1172906240 27000 0 %z} {-881220600 32400 0 %z} {-766054800 27000 0 %z} {-683883000 28800 0 %z} {-620812800 27000 0 %z} {-189415800 28800 0 WITA} {567964800 25200 0 WIB} } |
Changes to library/tzdata/Asia/Qatar.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Qatar) { {-9223372036854775808 12368 0 LMT} | | | | 1 2 3 4 5 6 7 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Qatar) { {-9223372036854775808 12368 0 LMT} {-1577935568 14400 0 %z} {76190400 10800 0 %z} } |
Changes to library/tzdata/Asia/Qostanay.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Qostanay) { {-9223372036854775808 15268 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Qostanay) { {-9223372036854775808 15268 0 LMT} {-1441167268 14400 0 %z} {-1247544000 18000 0 %z} {354913200 21600 1 %z} {370720800 21600 0 %z} {386445600 18000 0 %z} {386449200 21600 1 %z} {402256800 18000 0 %z} {417985200 21600 1 %z} {433792800 18000 0 %z} {449607600 21600 1 %z} {465339600 18000 0 %z} {481064400 21600 1 %z} {496789200 18000 0 %z} {512514000 21600 1 %z} {528238800 18000 0 %z} {543963600 21600 1 %z} {559688400 18000 0 %z} {575413200 21600 1 %z} {591138000 18000 0 %z} {606862800 21600 1 %z} {622587600 18000 0 %z} {638312400 21600 1 %z} {654642000 18000 0 %z} {670366800 14400 0 %z} {670370400 18000 1 %z} {686095200 14400 0 %z} {695772000 18000 0 %z} {701816400 21600 1 %z} {717541200 18000 0 %z} {733266000 21600 1 %z} {748990800 18000 0 %z} {764715600 21600 1 %z} {780440400 18000 0 %z} {796165200 21600 1 %z} {811890000 18000 0 %z} {828219600 21600 1 %z} {846363600 18000 0 %z} {859669200 21600 1 %z} {877813200 18000 0 %z} {891118800 21600 1 %z} {909262800 18000 0 %z} {922568400 21600 1 %z} {941317200 18000 0 %z} {954018000 21600 1 %z} {972766800 18000 0 %z} {985467600 21600 1 %z} {1004216400 18000 0 %z} {1017522000 21600 1 %z} {1035666000 18000 0 %z} {1048971600 21600 1 %z} {1067115600 18000 0 %z} {1080421200 21600 1 %z} {1099170000 21600 0 %z} {1709229600 18000 0 %z} } |
Changes to library/tzdata/Asia/Qyzylorda.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Qyzylorda) { {-9223372036854775808 15712 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Qyzylorda) { {-9223372036854775808 15712 0 LMT} {-1441167712 14400 0 %z} {-1247544000 18000 0 %z} {354913200 21600 1 %z} {370720800 21600 0 %z} {386445600 18000 0 %z} {386449200 21600 1 %z} {402256800 18000 0 %z} {417985200 21600 1 %z} {433792800 18000 0 %z} {449607600 21600 1 %z} {465339600 18000 0 %z} {481064400 21600 1 %z} {496789200 18000 0 %z} {512514000 21600 1 %z} {528238800 18000 0 %z} {543963600 21600 1 %z} {559688400 18000 0 %z} {575413200 21600 1 %z} {591138000 18000 0 %z} {606862800 21600 1 %z} {622587600 18000 0 %z} {638312400 21600 1 %z} {654642000 18000 0 %z} {670366800 14400 0 %z} {670370400 18000 1 %z} {701812800 18000 0 %z} {701816400 21600 1 %z} {717541200 18000 0 %z} {733266000 21600 1 %z} {748990800 18000 0 %z} {764715600 21600 1 %z} {780440400 18000 0 %z} {796165200 21600 1 %z} {811890000 18000 0 %z} {828219600 21600 1 %z} {846363600 18000 0 %z} {859669200 21600 1 %z} {877813200 18000 0 %z} {891118800 21600 1 %z} {909262800 18000 0 %z} {922568400 21600 1 %z} {941317200 18000 0 %z} {954018000 21600 1 %z} {972766800 18000 0 %z} {985467600 21600 1 %z} {1004216400 18000 0 %z} {1017522000 21600 1 %z} {1035666000 18000 0 %z} {1048971600 21600 1 %z} {1067115600 18000 0 %z} {1080421200 21600 1 %z} {1099170000 21600 0 %z} {1545328800 18000 0 %z} } |
Changes to library/tzdata/Asia/Riyadh.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Riyadh) { {-9223372036854775808 11212 0 LMT} | | | 1 2 3 4 5 6 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Riyadh) { {-9223372036854775808 11212 0 LMT} {-719636812 10800 0 %z} } |
Changes to library/tzdata/Asia/Sakhalin.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Sakhalin) { {-9223372036854775808 34248 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Sakhalin) { {-9223372036854775808 34248 0 LMT} {-2031039048 32400 0 %z} {-768560400 39600 0 %z} {354891600 43200 1 %z} {370699200 39600 0 %z} {386427600 43200 1 %z} {402235200 39600 0 %z} {417963600 43200 1 %z} {433771200 39600 0 %z} {449586000 43200 1 %z} {465318000 39600 0 %z} {481042800 43200 1 %z} {496767600 39600 0 %z} {512492400 43200 1 %z} {528217200 39600 0 %z} {543942000 43200 1 %z} {559666800 39600 0 %z} {575391600 43200 1 %z} {591116400 39600 0 %z} {606841200 43200 1 %z} {622566000 39600 0 %z} {638290800 43200 1 %z} {654620400 39600 0 %z} {670345200 36000 0 %z} {670348800 39600 1 %z} {686073600 36000 0 %z} {695750400 39600 0 %z} {701794800 43200 1 %z} {717519600 39600 0 %z} {733244400 43200 1 %z} {748969200 39600 0 %z} {764694000 43200 1 %z} {780418800 39600 0 %z} {796143600 43200 1 %z} {811868400 39600 0 %z} {828198000 43200 1 %z} {846342000 39600 0 %z} {859647600 36000 0 %z} {859651200 39600 1 %z} {877795200 36000 0 %z} {891100800 39600 1 %z} {909244800 36000 0 %z} {922550400 39600 1 %z} {941299200 36000 0 %z} {954000000 39600 1 %z} {972748800 36000 0 %z} {985449600 39600 1 %z} {1004198400 36000 0 %z} {1017504000 39600 1 %z} {1035648000 36000 0 %z} {1048953600 39600 1 %z} {1067097600 36000 0 %z} {1080403200 39600 1 %z} {1099152000 36000 0 %z} {1111852800 39600 1 %z} {1130601600 36000 0 %z} {1143302400 39600 1 %z} {1162051200 36000 0 %z} {1174752000 39600 1 %z} {1193500800 36000 0 %z} {1206806400 39600 1 %z} {1224950400 36000 0 %z} {1238256000 39600 1 %z} {1256400000 36000 0 %z} {1269705600 39600 1 %z} {1288454400 36000 0 %z} {1301155200 39600 0 %z} {1414249200 36000 0 %z} {1459008000 39600 0 %z} } |
Changes to library/tzdata/Asia/Samarkand.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Samarkand) { {-9223372036854775808 16073 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Samarkand) { {-9223372036854775808 16073 0 LMT} {-1441168073 14400 0 %z} {-1247544000 18000 0 %z} {354913200 21600 1 %z} {370720800 21600 0 %z} {386445600 18000 0 %z} {386449200 21600 1 %z} {402256800 18000 0 %z} {417985200 21600 1 %z} {433792800 18000 0 %z} {449607600 21600 1 %z} {465339600 18000 0 %z} {481064400 21600 1 %z} {496789200 18000 0 %z} {512514000 21600 1 %z} {528238800 18000 0 %z} {543963600 21600 1 %z} {559688400 18000 0 %z} {575413200 21600 1 %z} {591138000 18000 0 %z} {606862800 21600 1 %z} {622587600 18000 0 %z} {638312400 21600 1 %z} {654642000 18000 0 %z} {670366800 21600 1 %z} {686091600 18000 0 %z} {694206000 18000 0 %z} } |
Changes to library/tzdata/Asia/Singapore.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Singapore) { {-9223372036854775808 24925 0 LMT} {-2177477725 24925 0 SMT} | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Singapore) { {-9223372036854775808 24925 0 LMT} {-2177477725 24925 0 SMT} {-2038200925 25200 0 %z} {-1167634800 26400 1 %z} {-1073028000 26400 0 %z} {-894180000 27000 0 %z} {-879665400 32400 0 %z} {-767005200 27000 0 %z} {378662400 28800 0 %z} } |
Changes to library/tzdata/Asia/Srednekolymsk.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Srednekolymsk) { {-9223372036854775808 36892 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Srednekolymsk) { {-9223372036854775808 36892 0 LMT} {-1441188892 36000 0 %z} {-1247565600 39600 0 %z} {354891600 43200 1 %z} {370699200 39600 0 %z} {386427600 43200 1 %z} {402235200 39600 0 %z} {417963600 43200 1 %z} {433771200 39600 0 %z} {449586000 43200 1 %z} {465318000 39600 0 %z} {481042800 43200 1 %z} {496767600 39600 0 %z} {512492400 43200 1 %z} {528217200 39600 0 %z} {543942000 43200 1 %z} {559666800 39600 0 %z} {575391600 43200 1 %z} {591116400 39600 0 %z} {606841200 43200 1 %z} {622566000 39600 0 %z} {638290800 43200 1 %z} {654620400 39600 0 %z} {670345200 36000 0 %z} {670348800 39600 1 %z} {686073600 36000 0 %z} {695750400 39600 0 %z} {701794800 43200 1 %z} {717519600 39600 0 %z} {733244400 43200 1 %z} {748969200 39600 0 %z} {764694000 43200 1 %z} {780418800 39600 0 %z} {796143600 43200 1 %z} {811868400 39600 0 %z} {828198000 43200 1 %z} {846342000 39600 0 %z} {859647600 43200 1 %z} {877791600 39600 0 %z} {891097200 43200 1 %z} {909241200 39600 0 %z} {922546800 43200 1 %z} {941295600 39600 0 %z} {953996400 43200 1 %z} {972745200 39600 0 %z} {985446000 43200 1 %z} {1004194800 39600 0 %z} {1017500400 43200 1 %z} {1035644400 39600 0 %z} {1048950000 43200 1 %z} {1067094000 39600 0 %z} {1080399600 43200 1 %z} {1099148400 39600 0 %z} {1111849200 43200 1 %z} {1130598000 39600 0 %z} {1143298800 43200 1 %z} {1162047600 39600 0 %z} {1174748400 43200 1 %z} {1193497200 39600 0 %z} {1206802800 43200 1 %z} {1224946800 39600 0 %z} {1238252400 43200 1 %z} {1256396400 39600 0 %z} {1269702000 43200 1 %z} {1288450800 39600 0 %z} {1301151600 43200 0 %z} {1414245600 39600 0 %z} } |
Changes to library/tzdata/Asia/Tashkent.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Tashkent) { {-9223372036854775808 16631 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Tashkent) { {-9223372036854775808 16631 0 LMT} {-1441168631 18000 0 %z} {-1247547600 21600 0 %z} {354909600 25200 1 %z} {370717200 21600 0 %z} {386445600 25200 1 %z} {402253200 21600 0 %z} {417981600 25200 1 %z} {433789200 21600 0 %z} {449604000 25200 1 %z} {465336000 21600 0 %z} {481060800 25200 1 %z} {496785600 21600 0 %z} {512510400 25200 1 %z} {528235200 21600 0 %z} {543960000 25200 1 %z} {559684800 21600 0 %z} {575409600 25200 1 %z} {591134400 21600 0 %z} {606859200 25200 1 %z} {622584000 21600 0 %z} {638308800 25200 1 %z} {654638400 21600 0 %z} {670363200 18000 0 %z} {670366800 21600 1 %z} {686091600 18000 0 %z} {694206000 18000 0 %z} } |
Changes to library/tzdata/Asia/Tbilisi.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Tbilisi) { {-9223372036854775808 10751 0 LMT} {-2840151551 10751 0 TBMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Tbilisi) { {-9223372036854775808 10751 0 LMT} {-2840151551 10751 0 TBMT} {-1441162751 10800 0 %z} {-405140400 14400 0 %z} {354916800 18000 1 %z} {370724400 14400 0 %z} {386452800 18000 1 %z} {402260400 14400 0 %z} {417988800 18000 1 %z} {433796400 14400 0 %z} {449611200 18000 1 %z} {465343200 14400 0 %z} {481068000 18000 1 %z} {496792800 14400 0 %z} {512517600 18000 1 %z} {528242400 14400 0 %z} {543967200 18000 1 %z} {559692000 14400 0 %z} {575416800 18000 1 %z} {591141600 14400 0 %z} {606866400 18000 1 %z} {622591200 14400 0 %z} {638316000 18000 1 %z} {654645600 14400 0 %z} {670370400 10800 0 %z} {670374000 14400 1 %z} {686098800 10800 0 %z} {694213200 10800 0 %z} {701816400 14400 1 %z} {717537600 10800 0 %z} {733266000 14400 1 %z} {748987200 10800 0 %z} {764715600 14400 1 %z} {780440400 14400 0 %z} {796161600 18000 1 %z} {811882800 14400 0 %z} {828216000 18000 1 %z} {846360000 18000 1 %z} {859662000 18000 0 %z} {877806000 14400 0 %z} {891115200 18000 1 %z} {909255600 14400 0 %z} {922564800 18000 1 %z} {941310000 14400 0 %z} {954014400 18000 1 %z} {972759600 14400 0 %z} {985464000 18000 1 %z} {1004209200 14400 0 %z} {1017518400 18000 1 %z} {1035658800 14400 0 %z} {1048968000 18000 1 %z} {1067108400 14400 0 %z} {1080417600 18000 1 %z} {1088280000 14400 0 %z} {1099177200 10800 0 %z} {1111878000 14400 0 %z} } |
Changes to library/tzdata/Asia/Tehran.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Tehran) { {-9223372036854775808 12344 0 LMT} {-1704165944 12344 0 TMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Tehran) { {-9223372036854775808 12344 0 LMT} {-1704165944 12344 0 TMT} {-1090466744 12600 0 %z} {227820600 16200 1 %z} {246227400 14400 0 %z} {259617600 18000 1 %z} {271108800 14400 0 %z} {283982400 12600 0 %z} {296598600 16200 1 %z} {306531000 12600 0 %z} {322432200 16200 1 %z} {338499000 12600 0 %z} {673216200 16200 1 %z} {685481400 12600 0 %z} {701209800 16200 1 %z} {717103800 12600 0 %z} {732745800 16200 1 %z} {748639800 12600 0 %z} {764281800 16200 1 %z} {780175800 12600 0 %z} {795817800 16200 1 %z} {811711800 12600 0 %z} {827353800 16200 1 %z} {843247800 12600 0 %z} {858976200 16200 1 %z} {874870200 12600 0 %z} {890512200 16200 1 %z} {906406200 12600 0 %z} {922048200 16200 1 %z} {937942200 12600 0 %z} {953584200 16200 1 %z} {969478200 12600 0 %z} {985206600 16200 1 %z} {1001100600 12600 0 %z} {1016742600 16200 1 %z} {1032636600 12600 0 %z} {1048278600 16200 1 %z} {1064172600 12600 0 %z} {1079814600 16200 1 %z} {1095708600 12600 0 %z} {1111437000 16200 1 %z} {1127331000 12600 0 %z} {1206045000 16200 1 %z} {1221939000 12600 0 %z} {1237667400 16200 1 %z} {1253561400 12600 0 %z} {1269203400 16200 1 %z} {1285097400 12600 0 %z} {1300739400 16200 1 %z} {1316633400 12600 0 %z} {1332275400 16200 1 %z} {1348169400 12600 0 %z} {1363897800 16200 1 %z} {1379791800 12600 0 %z} {1395433800 16200 1 %z} {1411327800 12600 0 %z} {1426969800 16200 1 %z} {1442863800 12600 0 %z} {1458505800 16200 1 %z} {1474399800 12600 0 %z} {1490128200 16200 1 %z} {1506022200 12600 0 %z} {1521664200 16200 1 %z} {1537558200 12600 0 %z} {1553200200 16200 1 %z} {1569094200 12600 0 %z} {1584736200 16200 1 %z} {1600630200 12600 0 %z} {1616358600 16200 1 %z} {1632252600 12600 0 %z} {1647894600 16200 1 %z} {1663788600 12600 0 %z} } |
Changes to library/tzdata/Asia/Thimphu.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Thimphu) { {-9223372036854775808 21516 0 LMT} | | | | 1 2 3 4 5 6 7 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Thimphu) { {-9223372036854775808 21516 0 LMT} {-706341516 19800 0 %z} {560025000 21600 0 %z} } |
Changes to library/tzdata/Asia/Tomsk.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Tomsk) { {-9223372036854775808 20391 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Tomsk) { {-9223372036854775808 20391 0 LMT} {-1578807591 21600 0 %z} {-1247551200 25200 0 %z} {354906000 28800 1 %z} {370713600 25200 0 %z} {386442000 28800 1 %z} {402249600 25200 0 %z} {417978000 28800 1 %z} {433785600 25200 0 %z} {449600400 28800 1 %z} {465332400 25200 0 %z} {481057200 28800 1 %z} {496782000 25200 0 %z} {512506800 28800 1 %z} {528231600 25200 0 %z} {543956400 28800 1 %z} {559681200 25200 0 %z} {575406000 28800 1 %z} {591130800 25200 0 %z} {606855600 28800 1 %z} {622580400 25200 0 %z} {638305200 28800 1 %z} {654634800 25200 0 %z} {670359600 21600 0 %z} {670363200 25200 1 %z} {686088000 21600 0 %z} {695764800 25200 0 %z} {701809200 28800 1 %z} {717534000 25200 0 %z} {733258800 28800 1 %z} {748983600 25200 0 %z} {764708400 28800 1 %z} {780433200 25200 0 %z} {796158000 28800 1 %z} {811882800 25200 0 %z} {828212400 28800 1 %z} {846356400 25200 0 %z} {859662000 28800 1 %z} {877806000 25200 0 %z} {891111600 28800 1 %z} {909255600 25200 0 %z} {922561200 28800 1 %z} {941310000 25200 0 %z} {954010800 28800 1 %z} {972759600 25200 0 %z} {985460400 28800 1 %z} {1004209200 25200 0 %z} {1017514800 28800 1 %z} {1020196800 25200 0 %z} {1035662400 21600 0 %z} {1048968000 25200 1 %z} {1067112000 21600 0 %z} {1080417600 25200 1 %z} {1099166400 21600 0 %z} {1111867200 25200 1 %z} {1130616000 21600 0 %z} {1143316800 25200 1 %z} {1162065600 21600 0 %z} {1174766400 25200 1 %z} {1193515200 21600 0 %z} {1206820800 25200 1 %z} {1224964800 21600 0 %z} {1238270400 25200 1 %z} {1256414400 21600 0 %z} {1269720000 25200 1 %z} {1288468800 21600 0 %z} {1301169600 25200 0 %z} {1414263600 21600 0 %z} {1464465600 25200 0 %z} } |
Changes to library/tzdata/Asia/Ulaanbaatar.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Ulaanbaatar) { {-9223372036854775808 25652 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Ulaanbaatar) { {-9223372036854775808 25652 0 LMT} {-2032931252 25200 0 %z} {252435600 28800 0 %z} {417974400 32400 1 %z} {433782000 28800 0 %z} {449596800 32400 1 %z} {465318000 28800 0 %z} {481046400 32400 1 %z} {496767600 28800 0 %z} {512496000 32400 1 %z} {528217200 28800 0 %z} {543945600 32400 1 %z} {559666800 28800 0 %z} {575395200 32400 1 %z} {591116400 28800 0 %z} {606844800 32400 1 %z} {622566000 28800 0 %z} {638294400 32400 1 %z} {654620400 28800 0 %z} {670348800 32400 1 %z} {686070000 28800 0 %z} {701798400 32400 1 %z} {717519600 28800 0 %z} {733248000 32400 1 %z} {748969200 28800 0 %z} {764697600 32400 1 %z} {780418800 28800 0 %z} {796147200 32400 1 %z} {811868400 28800 0 %z} {828201600 32400 1 %z} {843922800 28800 0 %z} {859651200 32400 1 %z} {875372400 28800 0 %z} {891100800 32400 1 %z} {906822000 28800 0 %z} {988394400 32400 1 %z} {1001696400 28800 0 %z} {1017424800 32400 1 %z} {1033146000 28800 0 %z} {1048874400 32400 1 %z} {1064595600 28800 0 %z} {1080324000 32400 1 %z} {1096045200 28800 0 %z} {1111773600 32400 1 %z} {1127494800 28800 0 %z} {1143223200 32400 1 %z} {1159549200 28800 0 %z} {1427479200 32400 1 %z} {1443193200 28800 0 %z} {1458928800 32400 1 %z} {1474642800 28800 0 %z} } |
Changes to library/tzdata/Asia/Urumqi.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Urumqi) { {-9223372036854775808 21020 0 LMT} | | | 1 2 3 4 5 6 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Urumqi) { {-9223372036854775808 21020 0 LMT} {-1325483420 21600 0 %z} } |
Changes to library/tzdata/Asia/Ust-Nera.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Ust-Nera) { {-9223372036854775808 34374 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Ust-Nera) { {-9223372036854775808 34374 0 LMT} {-1579426374 28800 0 %z} {354898800 43200 0 %z} {370699200 39600 0 %z} {386427600 43200 1 %z} {402235200 39600 0 %z} {417963600 43200 1 %z} {433771200 39600 0 %z} {449586000 43200 1 %z} {465318000 39600 0 %z} {481042800 43200 1 %z} {496767600 39600 0 %z} {512492400 43200 1 %z} {528217200 39600 0 %z} {543942000 43200 1 %z} {559666800 39600 0 %z} {575391600 43200 1 %z} {591116400 39600 0 %z} {606841200 43200 1 %z} {622566000 39600 0 %z} {638290800 43200 1 %z} {654620400 39600 0 %z} {670345200 36000 0 %z} {670348800 39600 1 %z} {686073600 36000 0 %z} {695750400 39600 0 %z} {701794800 43200 1 %z} {717519600 39600 0 %z} {733244400 43200 1 %z} {748969200 39600 0 %z} {764694000 43200 1 %z} {780418800 39600 0 %z} {796143600 43200 1 %z} {811868400 39600 0 %z} {828198000 43200 1 %z} {846342000 39600 0 %z} {859647600 43200 1 %z} {877791600 39600 0 %z} {891097200 43200 1 %z} {909241200 39600 0 %z} {922546800 43200 1 %z} {941295600 39600 0 %z} {953996400 43200 1 %z} {972745200 39600 0 %z} {985446000 43200 1 %z} {1004194800 39600 0 %z} {1017500400 43200 1 %z} {1035644400 39600 0 %z} {1048950000 43200 1 %z} {1067094000 39600 0 %z} {1080399600 43200 1 %z} {1099148400 39600 0 %z} {1111849200 43200 1 %z} {1130598000 39600 0 %z} {1143298800 43200 1 %z} {1162047600 39600 0 %z} {1174748400 43200 1 %z} {1193497200 39600 0 %z} {1206802800 43200 1 %z} {1224946800 39600 0 %z} {1238252400 43200 1 %z} {1256396400 39600 0 %z} {1269702000 43200 1 %z} {1288450800 39600 0 %z} {1301151600 43200 0 %z} {1315828800 39600 0 %z} {1414249200 36000 0 %z} } |
Changes to library/tzdata/Asia/Vladivostok.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Vladivostok) { {-9223372036854775808 31651 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Vladivostok) { {-9223372036854775808 31651 0 LMT} {-1487321251 32400 0 %z} {-1247562000 36000 0 %z} {354895200 39600 1 %z} {370702800 36000 0 %z} {386431200 39600 1 %z} {402238800 36000 0 %z} {417967200 39600 1 %z} {433774800 36000 0 %z} {449589600 39600 1 %z} {465321600 36000 0 %z} {481046400 39600 1 %z} {496771200 36000 0 %z} {512496000 39600 1 %z} {528220800 36000 0 %z} {543945600 39600 1 %z} {559670400 36000 0 %z} {575395200 39600 1 %z} {591120000 36000 0 %z} {606844800 39600 1 %z} {622569600 36000 0 %z} {638294400 39600 1 %z} {654624000 36000 0 %z} {670348800 32400 0 %z} {670352400 36000 1 %z} {686077200 32400 0 %z} {695754000 36000 0 %z} {701798400 39600 1 %z} {717523200 36000 0 %z} {733248000 39600 1 %z} {748972800 36000 0 %z} {764697600 39600 1 %z} {780422400 36000 0 %z} {796147200 39600 1 %z} {811872000 36000 0 %z} {828201600 39600 1 %z} {846345600 36000 0 %z} {859651200 39600 1 %z} {877795200 36000 0 %z} {891100800 39600 1 %z} {909244800 36000 0 %z} {922550400 39600 1 %z} {941299200 36000 0 %z} {954000000 39600 1 %z} {972748800 36000 0 %z} {985449600 39600 1 %z} {1004198400 36000 0 %z} {1017504000 39600 1 %z} {1035648000 36000 0 %z} {1048953600 39600 1 %z} {1067097600 36000 0 %z} {1080403200 39600 1 %z} {1099152000 36000 0 %z} {1111852800 39600 1 %z} {1130601600 36000 0 %z} {1143302400 39600 1 %z} {1162051200 36000 0 %z} {1174752000 39600 1 %z} {1193500800 36000 0 %z} {1206806400 39600 1 %z} {1224950400 36000 0 %z} {1238256000 39600 1 %z} {1256400000 36000 0 %z} {1269705600 39600 1 %z} {1288454400 36000 0 %z} {1301155200 39600 0 %z} {1414249200 36000 0 %z} } |
Changes to library/tzdata/Asia/Yakutsk.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Yakutsk) { {-9223372036854775808 31138 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Yakutsk) { {-9223372036854775808 31138 0 LMT} {-1579423138 28800 0 %z} {-1247558400 32400 0 %z} {354898800 36000 1 %z} {370706400 32400 0 %z} {386434800 36000 1 %z} {402242400 32400 0 %z} {417970800 36000 1 %z} {433778400 32400 0 %z} {449593200 36000 1 %z} {465325200 32400 0 %z} {481050000 36000 1 %z} {496774800 32400 0 %z} {512499600 36000 1 %z} {528224400 32400 0 %z} {543949200 36000 1 %z} {559674000 32400 0 %z} {575398800 36000 1 %z} {591123600 32400 0 %z} {606848400 36000 1 %z} {622573200 32400 0 %z} {638298000 36000 1 %z} {654627600 32400 0 %z} {670352400 28800 0 %z} {670356000 32400 1 %z} {686080800 28800 0 %z} {695757600 32400 0 %z} {701802000 36000 1 %z} {717526800 32400 0 %z} {733251600 36000 1 %z} {748976400 32400 0 %z} {764701200 36000 1 %z} {780426000 32400 0 %z} {796150800 36000 1 %z} {811875600 32400 0 %z} {828205200 36000 1 %z} {846349200 32400 0 %z} {859654800 36000 1 %z} {877798800 32400 0 %z} {891104400 36000 1 %z} {909248400 32400 0 %z} {922554000 36000 1 %z} {941302800 32400 0 %z} {954003600 36000 1 %z} {972752400 32400 0 %z} {985453200 36000 1 %z} {1004202000 32400 0 %z} {1017507600 36000 1 %z} {1035651600 32400 0 %z} {1048957200 36000 1 %z} {1067101200 32400 0 %z} {1080406800 36000 1 %z} {1099155600 32400 0 %z} {1111856400 36000 1 %z} {1130605200 32400 0 %z} {1143306000 36000 1 %z} {1162054800 32400 0 %z} {1174755600 36000 1 %z} {1193504400 32400 0 %z} {1206810000 36000 1 %z} {1224954000 32400 0 %z} {1238259600 36000 1 %z} {1256403600 32400 0 %z} {1269709200 36000 1 %z} {1288458000 32400 0 %z} {1301158800 36000 0 %z} {1414252800 32400 0 %z} } |
Changes to library/tzdata/Asia/Yangon.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Yangon) { {-9223372036854775808 23087 0 LMT} {-2840163887 23087 0 RMT} | | | | | 1 2 3 4 5 6 7 8 9 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Yangon) { {-9223372036854775808 23087 0 LMT} {-2840163887 23087 0 RMT} {-1577946287 23400 0 %z} {-873268200 32400 0 %z} {-778410000 23400 0 %z} } |
Changes to library/tzdata/Asia/Yekaterinburg.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Yekaterinburg) { {-9223372036854775808 14553 0 LMT} {-1688270553 13505 0 PMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Yekaterinburg) { {-9223372036854775808 14553 0 LMT} {-1688270553 13505 0 PMT} {-1592610305 14400 0 %z} {-1247544000 18000 0 %z} {354913200 21600 1 %z} {370720800 18000 0 %z} {386449200 21600 1 %z} {402256800 18000 0 %z} {417985200 21600 1 %z} {433792800 18000 0 %z} {449607600 21600 1 %z} {465339600 18000 0 %z} {481064400 21600 1 %z} {496789200 18000 0 %z} {512514000 21600 1 %z} {528238800 18000 0 %z} {543963600 21600 1 %z} {559688400 18000 0 %z} {575413200 21600 1 %z} {591138000 18000 0 %z} {606862800 21600 1 %z} {622587600 18000 0 %z} {638312400 21600 1 %z} {654642000 18000 0 %z} {670366800 14400 0 %z} {670370400 18000 1 %z} {686095200 14400 0 %z} {695772000 18000 0 %z} {701816400 21600 1 %z} {717541200 18000 0 %z} {733266000 21600 1 %z} {748990800 18000 0 %z} {764715600 21600 1 %z} {780440400 18000 0 %z} {796165200 21600 1 %z} {811890000 18000 0 %z} {828219600 21600 1 %z} {846363600 18000 0 %z} {859669200 21600 1 %z} {877813200 18000 0 %z} {891118800 21600 1 %z} {909262800 18000 0 %z} {922568400 21600 1 %z} {941317200 18000 0 %z} {954018000 21600 1 %z} {972766800 18000 0 %z} {985467600 21600 1 %z} {1004216400 18000 0 %z} {1017522000 21600 1 %z} {1035666000 18000 0 %z} {1048971600 21600 1 %z} {1067115600 18000 0 %z} {1080421200 21600 1 %z} {1099170000 18000 0 %z} {1111870800 21600 1 %z} {1130619600 18000 0 %z} {1143320400 21600 1 %z} {1162069200 18000 0 %z} {1174770000 21600 1 %z} {1193518800 18000 0 %z} {1206824400 21600 1 %z} {1224968400 18000 0 %z} {1238274000 21600 1 %z} {1256418000 18000 0 %z} {1269723600 21600 1 %z} {1288472400 18000 0 %z} {1301173200 21600 0 %z} {1414267200 18000 0 %z} } |
Changes to library/tzdata/Asia/Yerevan.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Yerevan) { {-9223372036854775808 10680 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | # created by tools/tclZIC.tcl - do not edit set TZData(:Asia/Yerevan) { {-9223372036854775808 10680 0 LMT} {-1441162680 10800 0 %z} {-405140400 14400 0 %z} {354916800 18000 1 %z} {370724400 14400 0 %z} {386452800 18000 1 %z} {402260400 14400 0 %z} {417988800 18000 1 %z} {433796400 14400 0 %z} {449611200 18000 1 %z} {465343200 14400 0 %z} {481068000 18000 1 %z} {496792800 14400 0 %z} {512517600 18000 1 %z} {528242400 14400 0 %z} {543967200 18000 1 %z} {559692000 14400 0 %z} {575416800 18000 1 %z} {591141600 14400 0 %z} {606866400 18000 1 %z} {622591200 14400 0 %z} {638316000 18000 1 %z} {654645600 14400 0 %z} {670370400 10800 0 %z} {670374000 14400 1 %z} {686098800 10800 0 %z} {701823600 14400 1 %z} {717548400 10800 0 %z} {733273200 14400 1 %z} {748998000 10800 0 %z} {764722800 14400 1 %z} {780447600 10800 0 %z} {796172400 14400 1 %z} {811897200 14400 0 %z} {852062400 14400 0 %z} {859672800 18000 1 %z} {877816800 14400 0 %z} {891122400 18000 1 %z} {909266400 14400 0 %z} {922572000 18000 1 %z} {941320800 14400 0 %z} {954021600 18000 1 %z} {972770400 14400 0 %z} {985471200 18000 1 %z} {1004220000 14400 0 %z} {1017525600 18000 1 %z} {1035669600 14400 0 %z} {1048975200 18000 1 %z} {1067119200 14400 0 %z} {1080424800 18000 1 %z} {1099173600 14400 0 %z} {1111874400 18000 1 %z} {1130623200 14400 0 %z} {1143324000 18000 1 %z} {1162072800 14400 0 %z} {1174773600 18000 1 %z} {1193522400 14400 0 %z} {1206828000 18000 1 %z} {1224972000 14400 0 %z} {1238277600 18000 1 %z} {1256421600 14400 0 %z} {1269727200 18000 1 %z} {1288476000 14400 0 %z} {1293825600 14400 0 %z} {1301176800 18000 1 %z} {1319925600 14400 0 %z} } |
Changes to library/tzdata/Atlantic/Azores.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Atlantic/Azores) { {-9223372036854775808 -6160 0 LMT} {-2713904240 -6872 0 HMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | > | | | | > | | | > | | | > | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | < | | | | | < < | | | | < | < < | | | | | | | | | | | | | | | | > | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 | # created by tools/tclZIC.tcl - do not edit set TZData(:Atlantic/Azores) { {-9223372036854775808 -6160 0 LMT} {-2713904240 -6872 0 HMT} {-1830376800 -7200 0 %z} {-1689548400 -3600 1 %z} {-1677794400 -7200 0 %z} {-1667426400 -3600 1 %z} {-1647730800 -7200 0 %z} {-1635890400 -3600 1 %z} {-1616194800 -7200 0 %z} {-1604354400 -3600 1 %z} {-1584658800 -7200 0 %z} {-1572732000 -3600 1 %z} {-1553036400 -7200 0 %z} {-1541196000 -3600 1 %z} {-1521500400 -7200 0 %z} {-1442444400 -3600 1 %z} {-1427670000 -7200 0 %z} {-1379286000 -3600 1 %z} {-1364770800 -7200 0 %z} {-1348441200 -3600 1 %z} {-1333321200 -7200 0 %z} {-1316386800 -3600 1 %z} {-1301266800 -7200 0 %z} {-1284332400 -3600 1 %z} {-1269817200 -7200 0 %z} {-1221433200 -3600 1 %z} {-1206918000 -7200 0 %z} {-1191193200 -3600 1 %z} {-1175468400 -7200 0 %z} {-1127689200 -3600 1 %z} {-1111964400 -7200 0 %z} {-1096844400 -3600 1 %z} {-1080514800 -7200 0 %z} {-1063580400 -3600 1 %z} {-1049065200 -7200 0 %z} {-1033340400 -3600 1 %z} {-1017615600 -7200 0 %z} {-1002495600 -3600 1 %z} {-986166000 -7200 0 %z} {-969231600 -3600 1 %z} {-950482800 -7200 0 %z} {-942015600 -3600 1 %z} {-922489200 -7200 0 %z} {-906937200 -3600 1 %z} {-891126000 -7200 0 %z} {-877302000 -3600 1 %z} {-873676800 0 1 %z} {-864000000 -3600 1 %z} {-857948400 -7200 0 %z} {-845852400 -3600 1 %z} {-842832000 0 1 %z} {-831340800 -3600 1 %z} {-825894000 -7200 0 %z} {-814402800 -3600 1 %z} {-810777600 0 1 %z} {-799891200 -3600 1 %z} {-794444400 -7200 0 %z} {-782953200 -3600 1 %z} {-779328000 0 1 %z} {-768441600 -3600 1 %z} {-762994800 -7200 0 %z} {-749084400 -3600 1 %z} {-733359600 -7200 0 %z} {-717624000 -3600 1 %z} {-701899200 -7200 0 %z} {-686174400 -3600 1 %z} {-670449600 -7200 0 %z} {-654724800 -3600 1 %z} {-639000000 -7200 0 %z} {-623275200 -3600 1 %z} {-607550400 -7200 0 %z} {-591825600 -3600 1 %z} {-575496000 -7200 0 %z} {-559771200 -3600 1 %z} {-544046400 -7200 0 %z} {-528321600 -3600 1 %z} {-512596800 -7200 0 %z} {-496872000 -3600 1 %z} {-481147200 -7200 0 %z} {-465422400 -3600 1 %z} {-449697600 -7200 0 %z} {-433972800 -3600 1 %z} {-417643200 -7200 0 %z} {-401918400 -3600 1 %z} {-386193600 -7200 0 %z} {-370468800 -3600 1 %z} {-354744000 -7200 0 %z} {-339019200 -3600 1 %z} {-323294400 -7200 0 %z} {-307569600 -3600 1 %z} {-291844800 -7200 0 %z} {-276120000 -3600 1 %z} {-260395200 -7200 0 %z} {-244670400 -3600 1 %z} {-228340800 -7200 0 %z} {-212616000 -3600 1 %z} {-196891200 -7200 0 %z} {-181166400 -3600 1 %z} {-165441600 -7200 0 %z} {-149716800 -3600 1 %z} {-133992000 -7200 0 %z} {-118267200 -3600 1 %z} {-102542400 -3600 0 %z} {386125200 0 0 %z} {401850000 -3600 0 %z} {417574800 0 1 %z} {433299600 -3600 0 %z} {449024400 0 1 %z} {465354000 -3600 0 %z} {481078800 0 1 %z} {496803600 -3600 0 %z} {504925200 -3600 0 %z} {512528400 0 1 %z} {528253200 -3600 0 %z} {543978000 0 1 %z} {559702800 -3600 0 %z} {575427600 0 1 %z} {591152400 -3600 0 %z} {606877200 0 1 %z} {622602000 -3600 0 %z} {638326800 0 1 %z} {654656400 -3600 0 %z} {670381200 0 1 %z} {686106000 -3600 0 %z} {701830800 0 1 %z} {717555600 -3600 0 %z} {725421600 0 0 WET} {733280400 3600 1 WEST} {740278800 0 0 %z} {749005200 -3600 0 %z} {764730000 0 1 %z} {780454800 -3600 0 %z} {796179600 0 1 %z} {811904400 -3600 0 %z} {828234000 0 1 %z} {846378000 -3600 0 %z} {859683600 0 1 %z} {877827600 -3600 0 %z} {891133200 0 1 %z} {909277200 -3600 0 %z} {922582800 0 1 %z} {941331600 -3600 0 %z} {954032400 0 1 %z} {972781200 -3600 0 %z} {985482000 0 1 %z} {1004230800 -3600 0 %z} {1017536400 0 1 %z} {1035680400 -3600 0 %z} {1048986000 0 1 %z} {1067130000 -3600 0 %z} {1080435600 0 1 %z} {1099184400 -3600 0 %z} {1111885200 0 1 %z} {1130634000 -3600 0 %z} {1143334800 0 1 %z} {1162083600 -3600 0 %z} {1174784400 0 1 %z} {1193533200 -3600 0 %z} {1206838800 0 1 %z} {1224982800 -3600 0 %z} {1238288400 0 1 %z} {1256432400 -3600 0 %z} {1269738000 0 1 %z} {1288486800 -3600 0 %z} {1301187600 0 1 %z} {1319936400 -3600 0 %z} {1332637200 0 1 %z} {1351386000 -3600 0 %z} {1364691600 0 1 %z} {1382835600 -3600 0 %z} {1396141200 0 1 %z} {1414285200 -3600 0 %z} {1427590800 0 1 %z} {1445734800 -3600 0 %z} {1459040400 0 1 %z} {1477789200 -3600 0 %z} {1490490000 0 1 %z} {1509238800 -3600 0 %z} {1521939600 0 1 %z} {1540688400 -3600 0 %z} {1553994000 0 1 %z} {1572138000 -3600 0 %z} {1585443600 0 1 %z} {1603587600 -3600 0 %z} {1616893200 0 1 %z} {1635642000 -3600 0 %z} {1648342800 0 1 %z} {1667091600 -3600 0 %z} {1679792400 0 1 %z} {1698541200 -3600 0 %z} {1711846800 0 1 %z} {1729990800 -3600 0 %z} {1743296400 0 1 %z} {1761440400 -3600 0 %z} {1774746000 0 1 %z} {1792890000 -3600 0 %z} {1806195600 0 1 %z} {1824944400 -3600 0 %z} {1837645200 0 1 %z} {1856394000 -3600 0 %z} {1869094800 0 1 %z} {1887843600 -3600 0 %z} {1901149200 0 1 %z} {1919293200 -3600 0 %z} {1932598800 0 1 %z} {1950742800 -3600 0 %z} {1964048400 0 1 %z} {1982797200 -3600 0 %z} {1995498000 0 1 %z} {2014246800 -3600 0 %z} {2026947600 0 1 %z} {2045696400 -3600 0 %z} {2058397200 0 1 %z} {2077146000 -3600 0 %z} {2090451600 0 1 %z} {2108595600 -3600 0 %z} {2121901200 0 1 %z} {2140045200 -3600 0 %z} {2153350800 0 1 %z} {2172099600 -3600 0 %z} {2184800400 0 1 %z} {2203549200 -3600 0 %z} {2216250000 0 1 %z} {2234998800 -3600 0 %z} {2248304400 0 1 %z} {2266448400 -3600 0 %z} {2279754000 0 1 %z} {2297898000 -3600 0 %z} {2311203600 0 1 %z} {2329347600 -3600 0 %z} {2342653200 0 1 %z} {2361402000 -3600 0 %z} {2374102800 0 1 %z} {2392851600 -3600 0 %z} {2405552400 0 1 %z} {2424301200 -3600 0 %z} {2437606800 0 1 %z} {2455750800 -3600 0 %z} {2469056400 0 1 %z} {2487200400 -3600 0 %z} {2500506000 0 1 %z} {2519254800 -3600 0 %z} {2531955600 0 1 %z} {2550704400 -3600 0 %z} {2563405200 0 1 %z} {2582154000 -3600 0 %z} {2595459600 0 1 %z} {2613603600 -3600 0 %z} {2626909200 0 1 %z} {2645053200 -3600 0 %z} {2658358800 0 1 %z} {2676502800 -3600 0 %z} {2689808400 0 1 %z} {2708557200 -3600 0 %z} {2721258000 0 1 %z} {2740006800 -3600 0 %z} {2752707600 0 1 %z} {2771456400 -3600 0 %z} {2784762000 0 1 %z} {2802906000 -3600 0 %z} {2816211600 0 1 %z} {2834355600 -3600 0 %z} {2847661200 0 1 %z} {2866410000 -3600 0 %z} {2879110800 0 1 %z} {2897859600 -3600 0 %z} {2910560400 0 1 %z} {2929309200 -3600 0 %z} {2942010000 0 1 %z} {2960758800 -3600 0 %z} {2974064400 0 1 %z} {2992208400 -3600 0 %z} {3005514000 0 1 %z} {3023658000 -3600 0 %z} {3036963600 0 1 %z} {3055712400 -3600 0 %z} {3068413200 0 1 %z} {3087162000 -3600 0 %z} {3099862800 0 1 %z} {3118611600 -3600 0 %z} {3131917200 0 1 %z} {3150061200 -3600 0 %z} {3163366800 0 1 %z} {3181510800 -3600 0 %z} {3194816400 0 1 %z} {3212960400 -3600 0 %z} {3226266000 0 1 %z} {3245014800 -3600 0 %z} {3257715600 0 1 %z} {3276464400 -3600 0 %z} {3289165200 0 1 %z} {3307914000 -3600 0 %z} {3321219600 0 1 %z} {3339363600 -3600 0 %z} {3352669200 0 1 %z} {3370813200 -3600 0 %z} {3384118800 0 1 %z} {3402867600 -3600 0 %z} {3415568400 0 1 %z} {3434317200 -3600 0 %z} {3447018000 0 1 %z} {3465766800 -3600 0 %z} {3479072400 0 1 %z} {3497216400 -3600 0 %z} {3510522000 0 1 %z} {3528666000 -3600 0 %z} {3541971600 0 1 %z} {3560115600 -3600 0 %z} {3573421200 0 1 %z} {3592170000 -3600 0 %z} {3604870800 0 1 %z} {3623619600 -3600 0 %z} {3636320400 0 1 %z} {3655069200 -3600 0 %z} {3668374800 0 1 %z} {3686518800 -3600 0 %z} {3699824400 0 1 %z} {3717968400 -3600 0 %z} {3731274000 0 1 %z} {3750022800 -3600 0 %z} {3762723600 0 1 %z} {3781472400 -3600 0 %z} {3794173200 0 1 %z} {3812922000 -3600 0 %z} {3825622800 0 1 %z} {3844371600 -3600 0 %z} {3857677200 0 1 %z} {3875821200 -3600 0 %z} {3889126800 0 1 %z} {3907270800 -3600 0 %z} {3920576400 0 1 %z} {3939325200 -3600 0 %z} {3952026000 0 1 %z} {3970774800 -3600 0 %z} {3983475600 0 1 %z} {4002224400 -3600 0 %z} {4015530000 0 1 %z} {4033674000 -3600 0 %z} {4046979600 0 1 %z} {4065123600 -3600 0 %z} {4078429200 0 1 %z} {4096573200 -3600 0 %z} } |
Changes to library/tzdata/Atlantic/Canary.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Atlantic/Canary) { {-9223372036854775808 -3696 0 LMT} | | | 1 2 3 4 5 6 7 8 9 10 11 12 | # created by tools/tclZIC.tcl - do not edit set TZData(:Atlantic/Canary) { {-9223372036854775808 -3696 0 LMT} {-1509663504 -3600 0 %z} {-733874400 0 0 WET} {323827200 3600 1 WEST} {338950800 0 0 WET} {354675600 3600 1 WEST} {370400400 0 0 WET} {386125200 3600 1 WEST} {401850000 0 0 WET} |
︙ | ︙ |
Changes to library/tzdata/Atlantic/Cape_Verde.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Atlantic/Cape_Verde) { {-9223372036854775808 -5644 0 LMT} | | | | | | 1 2 3 4 5 6 7 8 9 | # created by tools/tclZIC.tcl - do not edit set TZData(:Atlantic/Cape_Verde) { {-9223372036854775808 -5644 0 LMT} {-1830376800 -7200 0 %z} {-862610400 -3600 1 %z} {-764118000 -7200 0 %z} {186120000 -3600 0 %z} } |
Changes to library/tzdata/Atlantic/Madeira.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Atlantic/Madeira) { {-9223372036854775808 -4056 0 LMT} {-2713906344 -4056 0 FMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | > | | | > | | | > | | | > | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | < | | | | | | < < | | | < < < < | < | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 | # created by tools/tclZIC.tcl - do not edit set TZData(:Atlantic/Madeira) { {-9223372036854775808 -4056 0 LMT} {-2713906344 -4056 0 FMT} {-1830380400 -3600 0 %z} {-1689552000 0 1 %z} {-1677798000 -3600 0 %z} {-1667430000 0 1 %z} {-1647734400 -3600 0 %z} {-1635894000 0 1 %z} {-1616198400 -3600 0 %z} {-1604358000 0 1 %z} {-1584662400 -3600 0 %z} {-1572735600 0 1 %z} {-1553040000 -3600 0 %z} {-1541199600 0 1 %z} {-1521504000 -3600 0 %z} {-1442448000 0 1 %z} {-1427673600 -3600 0 %z} {-1379289600 0 1 %z} {-1364774400 -3600 0 %z} {-1348444800 0 1 %z} {-1333324800 -3600 0 %z} {-1316390400 0 1 %z} {-1301270400 -3600 0 %z} {-1284336000 0 1 %z} {-1269820800 -3600 0 %z} {-1221436800 0 1 %z} {-1206921600 -3600 0 %z} {-1191196800 0 1 %z} {-1175472000 -3600 0 %z} {-1127692800 0 1 %z} {-1111968000 -3600 0 %z} {-1096848000 0 1 %z} {-1080518400 -3600 0 %z} {-1063584000 0 1 %z} {-1049068800 -3600 0 %z} {-1033344000 0 1 %z} {-1017619200 -3600 0 %z} {-1002499200 0 1 %z} {-986169600 -3600 0 %z} {-969235200 0 1 %z} {-950486400 -3600 0 %z} {-942019200 0 1 %z} {-922492800 -3600 0 %z} {-906940800 0 1 %z} {-891129600 -3600 0 %z} {-877305600 0 1 %z} {-873680400 3600 1 %z} {-864003600 0 1 %z} {-857952000 -3600 0 %z} {-845856000 0 1 %z} {-842835600 3600 1 %z} {-831344400 0 1 %z} {-825897600 -3600 0 %z} {-814406400 0 1 %z} {-810781200 3600 1 %z} {-799894800 0 1 %z} {-794448000 -3600 0 %z} {-782956800 0 1 %z} {-779331600 3600 1 %z} {-768445200 0 1 %z} {-762998400 -3600 0 %z} {-749088000 0 1 %z} {-733363200 -3600 0 %z} {-717627600 0 1 %z} {-701902800 -3600 0 %z} {-686178000 0 1 %z} {-670453200 -3600 0 %z} {-654728400 0 1 %z} {-639003600 -3600 0 %z} {-623278800 0 1 %z} {-607554000 -3600 0 %z} {-591829200 0 1 %z} {-575499600 -3600 0 %z} {-559774800 0 1 %z} {-544050000 -3600 0 %z} {-528325200 0 1 %z} {-512600400 -3600 0 %z} {-496875600 0 1 %z} {-481150800 -3600 0 %z} {-465426000 0 1 %z} {-449701200 -3600 0 %z} {-433976400 0 1 %z} {-417646800 -3600 0 %z} {-401922000 0 1 %z} {-386197200 -3600 0 %z} {-370472400 0 1 %z} {-354747600 -3600 0 %z} {-339022800 0 1 %z} {-323298000 -3600 0 %z} {-307573200 0 1 %z} {-291848400 -3600 0 %z} {-276123600 0 1 %z} {-260398800 -3600 0 %z} {-244674000 0 1 %z} {-228344400 -3600 0 %z} {-212619600 0 1 %z} {-196894800 -3600 0 %z} {-181170000 0 1 %z} {-165445200 -3600 0 %z} {-149720400 0 1 %z} {-133995600 -3600 0 %z} {-118270800 0 1 %z} {-102546000 0 0 WET} {386726400 3600 0 WEST} {401846400 0 0 WET} {417571200 3600 1 WEST} {433296000 0 0 WET} {449020800 3600 1 WEST} {465350400 0 0 WET} {481075200 3600 1 WEST} {496800000 0 0 WET} {512524800 3600 1 WEST} {523148400 3600 0 WEST} {528253200 0 0 WET} {543978000 3600 1 WEST} {559702800 0 0 WET} {575427600 3600 1 WEST} {591152400 0 0 WET} {606877200 3600 1 WEST} {622602000 0 0 WET} |
︙ | ︙ |
Changes to library/tzdata/Atlantic/South_Georgia.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Atlantic/South_Georgia) { {-9223372036854775808 -8768 0 LMT} | | | 1 2 3 4 5 6 | # created by tools/tclZIC.tcl - do not edit set TZData(:Atlantic/South_Georgia) { {-9223372036854775808 -8768 0 LMT} {-2524512832 -7200 0 %z} } |
Changes to library/tzdata/Atlantic/Stanley.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Atlantic/Stanley) { {-9223372036854775808 -13884 0 LMT} {-2524507716 -13884 0 SMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | # created by tools/tclZIC.tcl - do not edit set TZData(:Atlantic/Stanley) { {-9223372036854775808 -13884 0 LMT} {-2524507716 -13884 0 SMT} {-1824235716 -14400 0 %z} {-1018209600 -10800 1 %z} {-1003093200 -14400 0 %z} {-986760000 -10800 1 %z} {-971643600 -14400 0 %z} {-954705600 -10800 1 %z} {-939589200 -14400 0 %z} {-923256000 -10800 1 %z} {-908139600 -14400 0 %z} {-891806400 -10800 1 %z} {-876690000 -14400 0 %z} {-860356800 -10800 1 %z} {420606000 -7200 0 %z} {433303200 -7200 1 %z} {452052000 -10800 0 %z} {464151600 -7200 1 %z} {483501600 -10800 0 %z} {495597600 -14400 0 %z} {495604800 -10800 1 %z} {514350000 -14400 0 %z} {527054400 -10800 1 %z} {545799600 -14400 0 %z} {558504000 -10800 1 %z} {577249200 -14400 0 %z} {589953600 -10800 1 %z} {608698800 -14400 0 %z} {621403200 -10800 1 %z} {640753200 -14400 0 %z} {652852800 -10800 1 %z} {672202800 -14400 0 %z} {684907200 -10800 1 %z} {703652400 -14400 0 %z} {716356800 -10800 1 %z} {735102000 -14400 0 %z} {747806400 -10800 1 %z} {766551600 -14400 0 %z} {779256000 -10800 1 %z} {798001200 -14400 0 %z} {810705600 -10800 1 %z} {830055600 -14400 0 %z} {842760000 -10800 1 %z} {861505200 -14400 0 %z} {874209600 -10800 1 %z} {892954800 -14400 0 %z} {905659200 -10800 1 %z} {924404400 -14400 0 %z} {937108800 -10800 1 %z} {955854000 -14400 0 %z} {968558400 -10800 1 %z} {987310800 -14400 0 %z} {999410400 -10800 1 %z} {1019365200 -14400 0 %z} {1030860000 -10800 1 %z} {1050814800 -14400 0 %z} {1062914400 -10800 1 %z} {1082264400 -14400 0 %z} {1094364000 -10800 1 %z} {1113714000 -14400 0 %z} {1125813600 -10800 1 %z} {1145163600 -14400 0 %z} {1157263200 -10800 1 %z} {1176613200 -14400 0 %z} {1188712800 -10800 1 %z} {1208667600 -14400 0 %z} {1220767200 -10800 1 %z} {1240117200 -14400 0 %z} {1252216800 -10800 1 %z} {1271566800 -14400 0 %z} {1283662800 -10800 0 %z} } |
Changes to library/tzdata/Australia/Eucla.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Australia/Eucla) { {-9223372036854775808 30928 0 LMT} | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | # created by tools/tclZIC.tcl - do not edit set TZData(:Australia/Eucla) { {-9223372036854775808 30928 0 LMT} {-2337928528 31500 0 %z} {-1672555500 35100 1 %z} {-1665384300 31500 0 %z} {-883637100 35100 1 %z} {-876120300 31500 0 %z} {-860395500 35100 1 %z} {-844670700 31500 0 %z} {-836473500 35100 0 %z} {152039700 35100 1 %z} {162926100 31500 0 %z} {436295700 35100 1 %z} {447182100 31500 0 %z} {690311700 35100 1 %z} {699383700 31500 0 %z} {1165079700 35100 1 %z} {1174756500 31500 0 %z} {1193505300 35100 1 %z} {1206810900 31500 0 %z} {1224954900 35100 1 %z} {1238260500 31500 0 %z} } |
Changes to library/tzdata/Australia/Lord_Howe.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Australia/Lord_Howe) { {-9223372036854775808 38180 0 LMT} {-2364114980 36000 0 AEST} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 | # created by tools/tclZIC.tcl - do not edit set TZData(:Australia/Lord_Howe) { {-9223372036854775808 38180 0 LMT} {-2364114980 36000 0 AEST} {352216800 37800 0 %z} {372785400 41400 1 %z} {384273000 37800 0 %z} {404839800 41400 1 %z} {415722600 37800 0 %z} {436289400 41400 1 %z} {447172200 37800 0 %z} {467739000 41400 1 %z} {478621800 37800 0 %z} {488984400 37800 0 %z} {499188600 39600 1 %z} {511282800 37800 0 %z} {530033400 39600 1 %z} {542732400 37800 0 %z} {562087800 39600 1 %z} {574786800 37800 0 %z} {594142200 39600 1 %z} {606236400 37800 0 %z} {625591800 39600 1 %z} {636476400 37800 0 %z} {657041400 39600 1 %z} {667926000 37800 0 %z} {688491000 39600 1 %z} {699375600 37800 0 %z} {719940600 39600 1 %z} {731430000 37800 0 %z} {751995000 39600 1 %z} {762879600 37800 0 %z} {783444600 39600 1 %z} {794329200 37800 0 %z} {814894200 39600 1 %z} {828198000 37800 0 %z} {846343800 39600 1 %z} {859647600 37800 0 %z} {877793400 39600 1 %z} {891097200 37800 0 %z} {909243000 39600 1 %z} {922546800 37800 0 %z} {941297400 39600 1 %z} {953996400 37800 0 %z} {967303800 39600 1 %z} {985446000 37800 0 %z} {1004196600 39600 1 %z} {1017500400 37800 0 %z} {1035646200 39600 1 %z} {1048950000 37800 0 %z} {1067095800 39600 1 %z} {1080399600 37800 0 %z} {1099150200 39600 1 %z} {1111849200 37800 0 %z} {1130599800 39600 1 %z} {1143903600 37800 0 %z} {1162049400 39600 1 %z} {1174748400 37800 0 %z} {1193499000 39600 1 %z} {1207407600 37800 0 %z} {1223134200 39600 1 %z} {1238857200 37800 0 %z} {1254583800 39600 1 %z} {1270306800 37800 0 %z} {1286033400 39600 1 %z} {1301756400 37800 0 %z} {1317483000 39600 1 %z} {1333206000 37800 0 %z} {1349537400 39600 1 %z} {1365260400 37800 0 %z} {1380987000 39600 1 %z} {1396710000 37800 0 %z} {1412436600 39600 1 %z} {1428159600 37800 0 %z} {1443886200 39600 1 %z} {1459609200 37800 0 %z} {1475335800 39600 1 %z} {1491058800 37800 0 %z} {1506785400 39600 1 %z} {1522508400 37800 0 %z} {1538839800 39600 1 %z} {1554562800 37800 0 %z} {1570289400 39600 1 %z} {1586012400 37800 0 %z} {1601739000 39600 1 %z} {1617462000 37800 0 %z} {1633188600 39600 1 %z} {1648911600 37800 0 %z} {1664638200 39600 1 %z} {1680361200 37800 0 %z} {1696087800 39600 1 %z} {1712415600 37800 0 %z} {1728142200 39600 1 %z} {1743865200 37800 0 %z} {1759591800 39600 1 %z} {1775314800 37800 0 %z} {1791041400 39600 1 %z} {1806764400 37800 0 %z} {1822491000 39600 1 %z} {1838214000 37800 0 %z} {1853940600 39600 1 %z} {1869663600 37800 0 %z} {1885995000 39600 1 %z} {1901718000 37800 0 %z} {1917444600 39600 1 %z} {1933167600 37800 0 %z} {1948894200 39600 1 %z} {1964617200 37800 0 %z} {1980343800 39600 1 %z} {1996066800 37800 0 %z} {2011793400 39600 1 %z} {2027516400 37800 0 %z} {2043243000 39600 1 %z} {2058966000 37800 0 %z} {2075297400 39600 1 %z} {2091020400 37800 0 %z} {2106747000 39600 1 %z} {2122470000 37800 0 %z} {2138196600 39600 1 %z} {2153919600 37800 0 %z} {2169646200 39600 1 %z} {2185369200 37800 0 %z} {2201095800 39600 1 %z} {2216818800 37800 0 %z} {2233150200 39600 1 %z} {2248873200 37800 0 %z} {2264599800 39600 1 %z} {2280322800 37800 0 %z} {2296049400 39600 1 %z} {2311772400 37800 0 %z} {2327499000 39600 1 %z} {2343222000 37800 0 %z} {2358948600 39600 1 %z} {2374671600 37800 0 %z} {2390398200 39600 1 %z} {2406121200 37800 0 %z} {2422452600 39600 1 %z} {2438175600 37800 0 %z} {2453902200 39600 1 %z} {2469625200 37800 0 %z} {2485351800 39600 1 %z} {2501074800 37800 0 %z} {2516801400 39600 1 %z} {2532524400 37800 0 %z} {2548251000 39600 1 %z} {2563974000 37800 0 %z} {2579700600 39600 1 %z} {2596028400 37800 0 %z} {2611755000 39600 1 %z} {2627478000 37800 0 %z} {2643204600 39600 1 %z} {2658927600 37800 0 %z} {2674654200 39600 1 %z} {2690377200 37800 0 %z} {2706103800 39600 1 %z} {2721826800 37800 0 %z} {2737553400 39600 1 %z} {2753276400 37800 0 %z} {2769607800 39600 1 %z} {2785330800 37800 0 %z} {2801057400 39600 1 %z} {2816780400 37800 0 %z} {2832507000 39600 1 %z} {2848230000 37800 0 %z} {2863956600 39600 1 %z} {2879679600 37800 0 %z} {2895406200 39600 1 %z} {2911129200 37800 0 %z} {2926855800 39600 1 %z} {2942578800 37800 0 %z} {2958910200 39600 1 %z} {2974633200 37800 0 %z} {2990359800 39600 1 %z} {3006082800 37800 0 %z} {3021809400 39600 1 %z} {3037532400 37800 0 %z} {3053259000 39600 1 %z} {3068982000 37800 0 %z} {3084708600 39600 1 %z} {3100431600 37800 0 %z} {3116763000 39600 1 %z} {3132486000 37800 0 %z} {3148212600 39600 1 %z} {3163935600 37800 0 %z} {3179662200 39600 1 %z} {3195385200 37800 0 %z} {3211111800 39600 1 %z} {3226834800 37800 0 %z} {3242561400 39600 1 %z} {3258284400 37800 0 %z} {3274011000 39600 1 %z} {3289734000 37800 0 %z} {3306065400 39600 1 %z} {3321788400 37800 0 %z} {3337515000 39600 1 %z} {3353238000 37800 0 %z} {3368964600 39600 1 %z} {3384687600 37800 0 %z} {3400414200 39600 1 %z} {3416137200 37800 0 %z} {3431863800 39600 1 %z} {3447586800 37800 0 %z} {3463313400 39600 1 %z} {3479641200 37800 0 %z} {3495367800 39600 1 %z} {3511090800 37800 0 %z} {3526817400 39600 1 %z} {3542540400 37800 0 %z} {3558267000 39600 1 %z} {3573990000 37800 0 %z} {3589716600 39600 1 %z} {3605439600 37800 0 %z} {3621166200 39600 1 %z} {3636889200 37800 0 %z} {3653220600 39600 1 %z} {3668943600 37800 0 %z} {3684670200 39600 1 %z} {3700393200 37800 0 %z} {3716119800 39600 1 %z} {3731842800 37800 0 %z} {3747569400 39600 1 %z} {3763292400 37800 0 %z} {3779019000 39600 1 %z} {3794742000 37800 0 %z} {3810468600 39600 1 %z} {3826191600 37800 0 %z} {3842523000 39600 1 %z} {3858246000 37800 0 %z} {3873972600 39600 1 %z} {3889695600 37800 0 %z} {3905422200 39600 1 %z} {3921145200 37800 0 %z} {3936871800 39600 1 %z} {3952594800 37800 0 %z} {3968321400 39600 1 %z} {3984044400 37800 0 %z} {4000375800 39600 1 %z} {4016098800 37800 0 %z} {4031825400 39600 1 %z} {4047548400 37800 0 %z} {4063275000 39600 1 %z} {4078998000 37800 0 %z} {4094724600 39600 1 %z} } |
Changes to library/tzdata/CET.
1 | # created by tools/tclZIC.tcl - do not edit | > > | | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit if {![info exists TZData(Europe/Brussels)]} { LoadTimeZoneFile Europe/Brussels } set TZData(:CET) $TZData(:Europe/Brussels) |
Changes to library/tzdata/CST6CDT.
1 | # created by tools/tclZIC.tcl - do not edit | > > | | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit if {![info exists TZData(America/Chicago)]} { LoadTimeZoneFile America/Chicago } set TZData(:CST6CDT) $TZData(:America/Chicago) |
Changes to library/tzdata/EET.
1 | # created by tools/tclZIC.tcl - do not edit | > > | | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit if {![info exists TZData(Europe/Athens)]} { LoadTimeZoneFile Europe/Athens } set TZData(:EET) $TZData(:Europe/Athens) |
Changes to library/tzdata/EST.
1 | # created by tools/tclZIC.tcl - do not edit | > > | | < < | 1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit if {![info exists TZData(America/Panama)]} { LoadTimeZoneFile America/Panama } set TZData(:EST) $TZData(:America/Panama) |
Changes to library/tzdata/EST5EDT.
1 | # created by tools/tclZIC.tcl - do not edit | > > | | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit if {![info exists TZData(America/New_York)]} { LoadTimeZoneFile America/New_York } set TZData(:EST5EDT) $TZData(:America/New_York) |
Changes to library/tzdata/Etc/GMT+1.
1 2 3 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT+1) { | | | 1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT+1) { {-9223372036854775808 -3600 0 %z} } |
Changes to library/tzdata/Etc/GMT+10.
1 2 3 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT+10) { | | | 1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT+10) { {-9223372036854775808 -36000 0 %z} } |
Changes to library/tzdata/Etc/GMT+11.
1 2 3 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT+11) { | | | 1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT+11) { {-9223372036854775808 -39600 0 %z} } |
Changes to library/tzdata/Etc/GMT+12.
1 2 3 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT+12) { | | | 1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT+12) { {-9223372036854775808 -43200 0 %z} } |
Changes to library/tzdata/Etc/GMT+2.
1 2 3 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT+2) { | | | 1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT+2) { {-9223372036854775808 -7200 0 %z} } |
Changes to library/tzdata/Etc/GMT+3.
1 2 3 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT+3) { | | | 1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT+3) { {-9223372036854775808 -10800 0 %z} } |
Changes to library/tzdata/Etc/GMT+4.
1 2 3 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT+4) { | | | 1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT+4) { {-9223372036854775808 -14400 0 %z} } |
Changes to library/tzdata/Etc/GMT+5.
1 2 3 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT+5) { | | | 1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT+5) { {-9223372036854775808 -18000 0 %z} } |
Changes to library/tzdata/Etc/GMT+6.
1 2 3 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT+6) { | | | 1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT+6) { {-9223372036854775808 -21600 0 %z} } |
Changes to library/tzdata/Etc/GMT+7.
1 2 3 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT+7) { | | | 1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT+7) { {-9223372036854775808 -25200 0 %z} } |
Changes to library/tzdata/Etc/GMT+8.
1 2 3 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT+8) { | | | 1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT+8) { {-9223372036854775808 -28800 0 %z} } |
Changes to library/tzdata/Etc/GMT+9.
1 2 3 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT+9) { | | | 1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT+9) { {-9223372036854775808 -32400 0 %z} } |
Changes to library/tzdata/Etc/GMT-1.
1 2 3 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT-1) { | | | 1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT-1) { {-9223372036854775808 3600 0 %z} } |
Changes to library/tzdata/Etc/GMT-10.
1 2 3 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT-10) { | | | 1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT-10) { {-9223372036854775808 36000 0 %z} } |
Changes to library/tzdata/Etc/GMT-11.
1 2 3 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT-11) { | | | 1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT-11) { {-9223372036854775808 39600 0 %z} } |
Changes to library/tzdata/Etc/GMT-12.
1 2 3 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT-12) { | | | 1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT-12) { {-9223372036854775808 43200 0 %z} } |
Changes to library/tzdata/Etc/GMT-13.
1 2 3 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT-13) { | | | 1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT-13) { {-9223372036854775808 46800 0 %z} } |
Changes to library/tzdata/Etc/GMT-14.
1 2 3 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT-14) { | | | 1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT-14) { {-9223372036854775808 50400 0 %z} } |
Changes to library/tzdata/Etc/GMT-2.
1 2 3 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT-2) { | | | 1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT-2) { {-9223372036854775808 7200 0 %z} } |
Changes to library/tzdata/Etc/GMT-3.
1 2 3 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT-3) { | | | 1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT-3) { {-9223372036854775808 10800 0 %z} } |
Changes to library/tzdata/Etc/GMT-4.
1 2 3 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT-4) { | | | 1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT-4) { {-9223372036854775808 14400 0 %z} } |
Changes to library/tzdata/Etc/GMT-5.
1 2 3 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT-5) { | | | 1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT-5) { {-9223372036854775808 18000 0 %z} } |
Changes to library/tzdata/Etc/GMT-6.
1 2 3 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT-6) { | | | 1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT-6) { {-9223372036854775808 21600 0 %z} } |
Changes to library/tzdata/Etc/GMT-7.
1 2 3 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT-7) { | | | 1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT-7) { {-9223372036854775808 25200 0 %z} } |
Changes to library/tzdata/Etc/GMT-8.
1 2 3 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT-8) { | | | 1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT-8) { {-9223372036854775808 28800 0 %z} } |
Changes to library/tzdata/Etc/GMT-9.
1 2 3 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT-9) { | | | 1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Etc/GMT-9) { {-9223372036854775808 32400 0 %z} } |
Changes to library/tzdata/Europe/Astrakhan.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Europe/Astrakhan) { {-9223372036854775808 11532 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | # created by tools/tclZIC.tcl - do not edit set TZData(:Europe/Astrakhan) { {-9223372036854775808 11532 0 LMT} {-1441249932 10800 0 %z} {-1247540400 14400 0 %z} {354916800 18000 1 %z} {370724400 14400 0 %z} {386452800 18000 1 %z} {402260400 14400 0 %z} {417988800 18000 1 %z} {433796400 14400 0 %z} {449611200 18000 1 %z} {465343200 14400 0 %z} {481068000 18000 1 %z} {496792800 14400 0 %z} {512517600 18000 1 %z} {528242400 14400 0 %z} {543967200 18000 1 %z} {559692000 14400 0 %z} {575416800 18000 1 %z} {591141600 14400 0 %z} {606866400 10800 0 %z} {606870000 14400 1 %z} {622594800 10800 0 %z} {638319600 14400 1 %z} {654649200 10800 0 %z} {670374000 14400 0 %z} {701820000 10800 0 %z} {701823600 14400 1 %z} {717548400 10800 0 %z} {733273200 14400 1 %z} {748998000 10800 0 %z} {764722800 14400 1 %z} {780447600 10800 0 %z} {796172400 14400 1 %z} {811897200 10800 0 %z} {828226800 14400 1 %z} {846370800 10800 0 %z} {859676400 14400 1 %z} {877820400 10800 0 %z} {891126000 14400 1 %z} {909270000 10800 0 %z} {922575600 14400 1 %z} {941324400 10800 0 %z} {954025200 14400 1 %z} {972774000 10800 0 %z} {985474800 14400 1 %z} {1004223600 10800 0 %z} {1017529200 14400 1 %z} {1035673200 10800 0 %z} {1048978800 14400 1 %z} {1067122800 10800 0 %z} {1080428400 14400 1 %z} {1099177200 10800 0 %z} {1111878000 14400 1 %z} {1130626800 10800 0 %z} {1143327600 14400 1 %z} {1162076400 10800 0 %z} {1174777200 14400 1 %z} {1193526000 10800 0 %z} {1206831600 14400 1 %z} {1224975600 10800 0 %z} {1238281200 14400 1 %z} {1256425200 10800 0 %z} {1269730800 14400 1 %z} {1288479600 10800 0 %z} {1301180400 14400 0 %z} {1414274400 10800 0 %z} {1459033200 14400 0 %z} } |
Changes to library/tzdata/Europe/Istanbul.
︙ | ︙ | |||
45 46 47 48 49 50 51 | {164678400 10800 1 EEST} {184114800 7200 0 EET} {196214400 10800 1 EEST} {215564400 7200 0 EET} {228873600 10800 1 EEST} {245804400 7200 0 EET} {260323200 10800 1 EEST} | | | | | | 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | {164678400 10800 1 EEST} {184114800 7200 0 EET} {196214400 10800 1 EEST} {215564400 7200 0 EET} {228873600 10800 1 EEST} {245804400 7200 0 EET} {260323200 10800 1 EEST} {267919200 10800 0 %z} {277254000 10800 0 %z} {428454000 14400 1 %z} {433893600 10800 0 %z} {468111600 7200 0 EET} {482799600 10800 1 EEST} {496710000 7200 0 EET} {512521200 10800 1 EEST} {528246000 7200 0 EET} {543970800 10800 1 EEST} {559695600 7200 0 EET} |
︙ | ︙ | |||
117 118 119 120 121 122 123 | {1396141200 7200 0 EET} {1396227600 10800 0 EEST} {1414285200 7200 0 EET} {1427590800 10800 1 EEST} {1445734800 10800 1 EEST} {1446944400 7200 0 EET} {1459040400 10800 1 EEST} | | | 117 118 119 120 121 122 123 124 125 | {1396141200 7200 0 EET} {1396227600 10800 0 EEST} {1414285200 7200 0 EET} {1427590800 10800 1 EEST} {1445734800 10800 1 EEST} {1446944400 7200 0 EET} {1459040400 10800 1 EEST} {1473199200 10800 0 %z} } |
Changes to library/tzdata/Europe/Kaliningrad.
︙ | ︙ | |||
77 78 79 80 81 82 83 | {1193529600 7200 0 EET} {1206835200 10800 1 EEST} {1224979200 7200 0 EET} {1238284800 10800 1 EEST} {1256428800 7200 0 EET} {1269734400 10800 1 EEST} {1288483200 7200 0 EET} | | | 77 78 79 80 81 82 83 84 85 86 | {1193529600 7200 0 EET} {1206835200 10800 1 EEST} {1224979200 7200 0 EET} {1238284800 10800 1 EEST} {1256428800 7200 0 EET} {1269734400 10800 1 EEST} {1288483200 7200 0 EET} {1301184000 10800 0 %z} {1414278000 7200 0 EET} } |
Changes to library/tzdata/Europe/Kirov.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Europe/Kirov) { {-9223372036854775808 11928 0 LMT} | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | # created by tools/tclZIC.tcl - do not edit set TZData(:Europe/Kirov) { {-9223372036854775808 11928 0 LMT} {-1593820800 10800 0 %z} {-1247540400 14400 0 %z} {354916800 18000 1 %z} {370724400 14400 0 %z} {386452800 18000 1 %z} {402260400 14400 0 %z} {417988800 18000 1 %z} {433796400 14400 0 %z} {449611200 18000 1 %z} {465343200 14400 0 %z} {481068000 18000 1 %z} {496792800 14400 0 %z} {512517600 18000 1 %z} {528242400 14400 0 %z} {543967200 18000 1 %z} {559692000 14400 0 %z} {575416800 18000 1 %z} {591141600 14400 0 %z} {606866400 10800 0 MSD} {606870000 14400 1 MSD} {622594800 10800 0 MSK} {638319600 14400 1 MSD} {654649200 10800 0 MSK} {670374000 14400 0 %z} {701820000 10800 0 MSD} {701823600 14400 1 MSD} {717548400 10800 0 MSK} {733273200 14400 1 MSD} {748998000 10800 0 MSK} {764722800 14400 1 MSD} {780447600 10800 0 MSK} |
︙ | ︙ |
Changes to library/tzdata/Europe/Lisbon.
1 2 3 4 5 6 7 8 | # created by tools/tclZIC.tcl - do not edit set TZData(:Europe/Lisbon) { {-9223372036854775808 -2205 0 LMT} {-2713908195 -2205 0 LMT} {-1830384000 0 0 WET} {-1689555600 3600 1 WEST} {-1677801600 0 0 WET} | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | # created by tools/tclZIC.tcl - do not edit set TZData(:Europe/Lisbon) { {-9223372036854775808 -2205 0 LMT} {-2713908195 -2205 0 LMT} {-1830384000 0 0 WET} {-1689555600 3600 1 WEST} {-1677801600 0 0 WET} {-1667433600 3600 1 WEST} {-1647738000 0 0 WET} {-1635897600 3600 1 WEST} {-1616202000 0 0 WET} {-1604361600 3600 1 WEST} {-1584666000 0 0 WET} {-1572739200 3600 1 WEST} {-1553043600 0 0 WET} {-1541203200 3600 1 WEST} {-1521507600 0 0 WET} {-1442451600 3600 1 WEST} {-1427677200 0 0 WET} {-1379293200 3600 1 WEST} {-1364778000 0 0 WET} {-1348448400 3600 1 WEST} {-1333328400 0 0 WET} {-1316394000 3600 1 WEST} {-1301274000 0 0 WET} {-1284339600 3600 1 WEST} |
︙ | ︙ | |||
39 40 41 42 43 44 45 | {-1033347600 3600 1 WEST} {-1017622800 0 0 WET} {-1002502800 3600 1 WEST} {-986173200 0 0 WET} {-969238800 3600 1 WEST} {-950490000 0 0 WET} {-942022800 3600 1 WEST} | | | 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | {-1033347600 3600 1 WEST} {-1017622800 0 0 WET} {-1002502800 3600 1 WEST} {-986173200 0 0 WET} {-969238800 3600 1 WEST} {-950490000 0 0 WET} {-942022800 3600 1 WEST} {-922496400 0 0 WET} {-906944400 3600 1 WEST} {-891133200 0 0 WET} {-877309200 3600 1 WEST} {-873684000 7200 1 WEMT} {-864007200 3600 1 WEST} {-857955600 0 0 WET} {-845859600 3600 1 WEST} |
︙ | ︙ | |||
98 99 100 101 102 103 104 | {-228348000 0 0 WET} {-212623200 3600 1 WEST} {-196898400 0 0 WET} {-181173600 3600 1 WEST} {-165448800 0 0 WET} {-149724000 3600 1 WEST} {-133999200 0 0 WET} | | > > | | | | | | | | | | | | | > | | 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 | {-228348000 0 0 WET} {-212623200 3600 1 WEST} {-196898400 0 0 WET} {-181173600 3600 1 WEST} {-165448800 0 0 WET} {-149724000 3600 1 WEST} {-133999200 0 0 WET} {-118274400 3600 1 WEST} {-102549600 3600 0 CET} {212544000 0 0 WET} {212547600 0 0 WET} {228268800 3600 1 WEST} {243993600 0 0 WET} {260326800 3600 1 WEST} {276051600 0 0 WET} {291776400 3600 1 WEST} {307501200 0 0 WET} {323830800 3600 1 WEST} {338950800 0 0 WET} {354672000 3600 1 WEST} {370396800 0 0 WET} {386121600 3600 1 WEST} {401846400 0 0 WET} {417571200 3600 1 WEST} {433296000 0 0 WET} {449020800 3600 1 WEST} {465350400 0 0 WET} {481075200 3600 1 WEST} {496800000 0 0 WET} {504921600 0 0 WET} {512528400 3600 1 WEST} {528253200 0 0 WET} {543978000 3600 1 WEST} {559702800 0 0 WET} {575427600 3600 1 WEST} {591152400 0 0 WET} {606877200 3600 1 WEST} |
︙ | ︙ |
Changes to library/tzdata/Europe/Minsk.
︙ | ︙ | |||
67 68 69 70 71 72 73 | {1193529600 7200 0 EET} {1206835200 10800 1 EEST} {1224979200 7200 0 EET} {1238284800 10800 1 EEST} {1256428800 7200 0 EET} {1269734400 10800 1 EEST} {1288483200 7200 0 EET} | | | 67 68 69 70 71 72 73 74 75 | {1193529600 7200 0 EET} {1206835200 10800 1 EEST} {1224979200 7200 0 EET} {1238284800 10800 1 EEST} {1256428800 7200 0 EET} {1269734400 10800 1 EEST} {1288483200 7200 0 EET} {1301184000 10800 0 %z} } |
Changes to library/tzdata/Europe/Samara.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Europe/Samara) { {-9223372036854775808 12020 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | # created by tools/tclZIC.tcl - do not edit set TZData(:Europe/Samara) { {-9223372036854775808 12020 0 LMT} {-1593820800 10800 0 %z} {-1247540400 14400 0 %z} {-1102305600 14400 0 %z} {354916800 18000 1 %z} {370724400 14400 0 %z} {386452800 18000 1 %z} {402260400 14400 0 %z} {417988800 18000 1 %z} {433796400 14400 0 %z} {449611200 18000 1 %z} {465343200 14400 0 %z} {481068000 18000 1 %z} {496792800 14400 0 %z} {512517600 18000 1 %z} {528242400 14400 0 %z} {543967200 18000 1 %z} {559692000 14400 0 %z} {575416800 18000 1 %z} {591141600 14400 0 %z} {606866400 10800 0 %z} {606870000 14400 1 %z} {622594800 10800 0 %z} {638319600 14400 1 %z} {654649200 10800 0 %z} {670374000 7200 0 %z} {670377600 10800 1 %z} {686102400 10800 0 %z} {687916800 14400 0 %z} {701820000 18000 1 %z} {717544800 14400 0 %z} {733269600 18000 1 %z} {748994400 14400 0 %z} {764719200 18000 1 %z} {780444000 14400 0 %z} {796168800 18000 1 %z} {811893600 14400 0 %z} {828223200 18000 1 %z} {846367200 14400 0 %z} {859672800 18000 1 %z} {877816800 14400 0 %z} {891122400 18000 1 %z} {909266400 14400 0 %z} {922572000 18000 1 %z} {941320800 14400 0 %z} {954021600 18000 1 %z} {972770400 14400 0 %z} {985471200 18000 1 %z} {1004220000 14400 0 %z} {1017525600 18000 1 %z} {1035669600 14400 0 %z} {1048975200 18000 1 %z} {1067119200 14400 0 %z} {1080424800 18000 1 %z} {1099173600 14400 0 %z} {1111874400 18000 1 %z} {1130623200 14400 0 %z} {1143324000 18000 1 %z} {1162072800 14400 0 %z} {1174773600 18000 1 %z} {1193522400 14400 0 %z} {1206828000 18000 1 %z} {1224972000 14400 0 %z} {1238277600 18000 1 %z} {1256421600 14400 0 %z} {1269727200 10800 0 %z} {1269730800 14400 1 %z} {1288479600 10800 0 %z} {1301180400 14400 0 %z} } |
Changes to library/tzdata/Europe/Saratov.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Europe/Saratov) { {-9223372036854775808 11058 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | # created by tools/tclZIC.tcl - do not edit set TZData(:Europe/Saratov) { {-9223372036854775808 11058 0 LMT} {-1593820800 10800 0 %z} {-1247540400 14400 0 %z} {354916800 18000 1 %z} {370724400 14400 0 %z} {386452800 18000 1 %z} {402260400 14400 0 %z} {417988800 18000 1 %z} {433796400 14400 0 %z} {449611200 18000 1 %z} {465343200 14400 0 %z} {481068000 18000 1 %z} {496792800 14400 0 %z} {512517600 18000 1 %z} {528242400 14400 0 %z} {543967200 18000 1 %z} {559692000 14400 0 %z} {575416800 10800 0 %z} {575420400 14400 1 %z} {591145200 10800 0 %z} {606870000 14400 1 %z} {622594800 10800 0 %z} {638319600 14400 1 %z} {654649200 10800 0 %z} {670374000 14400 0 %z} {701820000 10800 0 %z} {701823600 14400 1 %z} {717548400 10800 0 %z} {733273200 14400 1 %z} {748998000 10800 0 %z} {764722800 14400 1 %z} {780447600 10800 0 %z} {796172400 14400 1 %z} {811897200 10800 0 %z} {828226800 14400 1 %z} {846370800 10800 0 %z} {859676400 14400 1 %z} {877820400 10800 0 %z} {891126000 14400 1 %z} {909270000 10800 0 %z} {922575600 14400 1 %z} {941324400 10800 0 %z} {954025200 14400 1 %z} {972774000 10800 0 %z} {985474800 14400 1 %z} {1004223600 10800 0 %z} {1017529200 14400 1 %z} {1035673200 10800 0 %z} {1048978800 14400 1 %z} {1067122800 10800 0 %z} {1080428400 14400 1 %z} {1099177200 10800 0 %z} {1111878000 14400 1 %z} {1130626800 10800 0 %z} {1143327600 14400 1 %z} {1162076400 10800 0 %z} {1174777200 14400 1 %z} {1193526000 10800 0 %z} {1206831600 14400 1 %z} {1224975600 10800 0 %z} {1238281200 14400 1 %z} {1256425200 10800 0 %z} {1269730800 14400 1 %z} {1288479600 10800 0 %z} {1301180400 14400 0 %z} {1414274400 10800 0 %z} {1480806000 14400 0 %z} } |
Changes to library/tzdata/Europe/Ulyanovsk.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Europe/Ulyanovsk) { {-9223372036854775808 11616 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | # created by tools/tclZIC.tcl - do not edit set TZData(:Europe/Ulyanovsk) { {-9223372036854775808 11616 0 LMT} {-1593820800 10800 0 %z} {-1247540400 14400 0 %z} {354916800 18000 1 %z} {370724400 14400 0 %z} {386452800 18000 1 %z} {402260400 14400 0 %z} {417988800 18000 1 %z} {433796400 14400 0 %z} {449611200 18000 1 %z} {465343200 14400 0 %z} {481068000 18000 1 %z} {496792800 14400 0 %z} {512517600 18000 1 %z} {528242400 14400 0 %z} {543967200 18000 1 %z} {559692000 14400 0 %z} {575416800 18000 1 %z} {591141600 14400 0 %z} {606866400 10800 0 %z} {606870000 14400 1 %z} {622594800 10800 0 %z} {638319600 14400 1 %z} {654649200 10800 0 %z} {670374000 7200 0 %z} {670377600 10800 1 %z} {686102400 7200 0 %z} {695779200 10800 0 %z} {701823600 14400 1 %z} {717548400 10800 0 %z} {733273200 14400 1 %z} {748998000 10800 0 %z} {764722800 14400 1 %z} {780447600 10800 0 %z} {796172400 14400 1 %z} {811897200 10800 0 %z} {828226800 14400 1 %z} {846370800 10800 0 %z} {859676400 14400 1 %z} {877820400 10800 0 %z} {891126000 14400 1 %z} {909270000 10800 0 %z} {922575600 14400 1 %z} {941324400 10800 0 %z} {954025200 14400 1 %z} {972774000 10800 0 %z} {985474800 14400 1 %z} {1004223600 10800 0 %z} {1017529200 14400 1 %z} {1035673200 10800 0 %z} {1048978800 14400 1 %z} {1067122800 10800 0 %z} {1080428400 14400 1 %z} {1099177200 10800 0 %z} {1111878000 14400 1 %z} {1130626800 10800 0 %z} {1143327600 14400 1 %z} {1162076400 10800 0 %z} {1174777200 14400 1 %z} {1193526000 10800 0 %z} {1206831600 14400 1 %z} {1224975600 10800 0 %z} {1238281200 14400 1 %z} {1256425200 10800 0 %z} {1269730800 14400 1 %z} {1288479600 10800 0 %z} {1301180400 14400 0 %z} {1414274400 10800 0 %z} {1459033200 14400 0 %z} } |
Changes to library/tzdata/Europe/Volgograd.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Europe/Volgograd) { {-9223372036854775808 10660 0 LMT} | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | # created by tools/tclZIC.tcl - do not edit set TZData(:Europe/Volgograd) { {-9223372036854775808 10660 0 LMT} {-1577761060 10800 0 %z} {-1247540400 14400 0 %z} {-256881600 14400 0 %z} {354916800 18000 1 %z} {370724400 14400 0 %z} {386452800 18000 1 %z} {402260400 14400 0 %z} {417988800 18000 1 %z} {433796400 14400 0 %z} {449611200 18000 1 %z} {465343200 14400 0 %z} {481068000 18000 1 %z} {496792800 14400 0 %z} {512517600 18000 1 %z} {528242400 14400 0 %z} {543967200 18000 1 %z} {559692000 14400 0 %z} {575416800 10800 0 MSD} {575420400 14400 1 MSD} {591145200 10800 0 MSK} {606870000 14400 1 MSD} {622594800 10800 0 MSK} {638319600 14400 1 MSD} {654649200 10800 0 MSK} {670374000 14400 0 %z} {701820000 10800 0 MSD} {701823600 14400 1 MSD} {717548400 10800 0 MSK} {733273200 14400 1 MSD} {748998000 10800 0 MSK} {764722800 14400 1 MSD} {780447600 10800 0 MSK} |
︙ | ︙ | |||
64 65 66 67 68 69 70 | {1224975600 10800 0 MSK} {1238281200 14400 1 MSD} {1256425200 10800 0 MSK} {1269730800 14400 1 MSD} {1288479600 10800 0 MSK} {1301180400 14400 0 MSK} {1414274400 10800 0 MSK} | | | 64 65 66 67 68 69 70 71 72 73 | {1224975600 10800 0 MSK} {1238281200 14400 1 MSD} {1256425200 10800 0 MSK} {1269730800 14400 1 MSD} {1288479600 10800 0 MSK} {1301180400 14400 0 MSK} {1414274400 10800 0 MSK} {1540681200 14400 0 %z} {1609020000 10800 0 MSK} } |
Changes to library/tzdata/HST.
1 | # created by tools/tclZIC.tcl - do not edit | > > | | < < | 1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit if {![info exists TZData(Pacific/Honolulu)]} { LoadTimeZoneFile Pacific/Honolulu } set TZData(:HST) $TZData(:Pacific/Honolulu) |
Changes to library/tzdata/Indian/Chagos.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Indian/Chagos) { {-9223372036854775808 17380 0 LMT} | | | | 1 2 3 4 5 6 7 | # created by tools/tclZIC.tcl - do not edit set TZData(:Indian/Chagos) { {-9223372036854775808 17380 0 LMT} {-1988167780 18000 0 %z} {820436400 21600 0 %z} } |
Changes to library/tzdata/Indian/Maldives.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Indian/Maldives) { {-9223372036854775808 17640 0 LMT} {-2840158440 17640 0 MMT} | | | 1 2 3 4 5 6 7 | # created by tools/tclZIC.tcl - do not edit set TZData(:Indian/Maldives) { {-9223372036854775808 17640 0 LMT} {-2840158440 17640 0 MMT} {-315636840 18000 0 %z} } |
Changes to library/tzdata/Indian/Mauritius.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Indian/Mauritius) { {-9223372036854775808 13800 0 LMT} | | | | | | | 1 2 3 4 5 6 7 8 9 10 | # created by tools/tclZIC.tcl - do not edit set TZData(:Indian/Mauritius) { {-9223372036854775808 13800 0 LMT} {-1988164200 14400 0 %z} {403041600 18000 1 %z} {417034800 14400 0 %z} {1224972000 18000 1 %z} {1238274000 14400 0 %z} } |
Changes to library/tzdata/MET.
1 | # created by tools/tclZIC.tcl - do not edit | > > | | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit if {![info exists TZData(Europe/Brussels)]} { LoadTimeZoneFile Europe/Brussels } set TZData(:MET) $TZData(:Europe/Brussels) |
Changes to library/tzdata/MST.
1 | # created by tools/tclZIC.tcl - do not edit | > > | | < < | 1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit if {![info exists TZData(America/Phoenix)]} { LoadTimeZoneFile America/Phoenix } set TZData(:MST) $TZData(:America/Phoenix) |
Changes to library/tzdata/MST7MDT.
1 | # created by tools/tclZIC.tcl - do not edit | > > | | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit if {![info exists TZData(America/Denver)]} { LoadTimeZoneFile America/Denver } set TZData(:MST7MDT) $TZData(:America/Denver) |
Changes to library/tzdata/PST8PDT.
1 | # created by tools/tclZIC.tcl - do not edit | > > | | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit if {![info exists TZData(America/Los_Angeles)]} { LoadTimeZoneFile America/Los_Angeles } set TZData(:PST8PDT) $TZData(:America/Los_Angeles) |
Changes to library/tzdata/Pacific/Apia.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Apia) { {-9223372036854775808 45184 0 LMT} {-2445424384 -41216 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Apia) { {-9223372036854775808 45184 0 LMT} {-2445424384 -41216 0 LMT} {-1861878784 -41400 0 %z} {-631110600 -39600 0 %z} {1285498800 -36000 1 %z} {1301752800 -39600 0 %z} {1316872800 -36000 1 %z} {1325239200 50400 0 %z} {1333202400 46800 0 %z} {1348927200 50400 1 %z} {1365256800 46800 0 %z} {1380376800 50400 1 %z} {1396706400 46800 0 %z} {1411826400 50400 1 %z} {1428156000 46800 0 %z} {1443276000 50400 1 %z} {1459605600 46800 0 %z} {1474725600 50400 1 %z} {1491055200 46800 0 %z} {1506175200 50400 1 %z} {1522504800 46800 0 %z} {1538229600 50400 1 %z} {1554559200 46800 0 %z} {1569679200 50400 1 %z} {1586008800 46800 0 %z} {1601128800 50400 1 %z} {1617458400 46800 0 %z} } |
Changes to library/tzdata/Pacific/Bougainville.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Bougainville) { {-9223372036854775808 37336 0 LMT} {-2840178136 35312 0 PMMT} | | | | | | 1 2 3 4 5 6 7 8 9 10 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Bougainville) { {-9223372036854775808 37336 0 LMT} {-2840178136 35312 0 PMMT} {-2366790512 36000 0 %z} {-868010400 32400 0 %z} {-768906000 36000 0 %z} {1419696000 39600 0 %z} } |
Changes to library/tzdata/Pacific/Chatham.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Chatham) { {-9223372036854775808 44028 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Chatham) { {-9223372036854775808 44028 0 LMT} {-3192437628 44100 0 %z} {-757426500 45900 0 %z} {152632800 49500 1 %z} {162309600 45900 0 %z} {183477600 49500 1 %z} {194968800 45900 0 %z} {215532000 49500 1 %z} {226418400 45900 0 %z} {246981600 49500 1 %z} {257868000 45900 0 %z} {278431200 49500 1 %z} {289317600 45900 0 %z} {309880800 49500 1 %z} {320767200 45900 0 %z} {341330400 49500 1 %z} {352216800 45900 0 %z} {372780000 49500 1 %z} {384271200 45900 0 %z} {404834400 49500 1 %z} {415720800 45900 0 %z} {436284000 49500 1 %z} {447170400 45900 0 %z} {467733600 49500 1 %z} {478620000 45900 0 %z} {499183200 49500 1 %z} {510069600 45900 0 %z} {530632800 49500 1 %z} {541519200 45900 0 %z} {562082400 49500 1 %z} {573573600 45900 0 %z} {594136800 49500 1 %z} {605023200 45900 0 %z} {623772000 49500 1 %z} {637682400 45900 0 %z} {655221600 49500 1 %z} {669132000 45900 0 %z} {686671200 49500 1 %z} {700581600 45900 0 %z} {718120800 49500 1 %z} {732636000 45900 0 %z} {749570400 49500 1 %z} {764085600 45900 0 %z} {781020000 49500 1 %z} {795535200 45900 0 %z} {812469600 49500 1 %z} {826984800 45900 0 %z} {844524000 49500 1 %z} {858434400 45900 0 %z} {875973600 49500 1 %z} {889884000 45900 0 %z} {907423200 49500 1 %z} {921938400 45900 0 %z} {938872800 49500 1 %z} {953388000 45900 0 %z} {970322400 49500 1 %z} {984837600 45900 0 %z} {1002376800 49500 1 %z} {1016287200 45900 0 %z} {1033826400 49500 1 %z} {1047736800 45900 0 %z} {1065276000 49500 1 %z} {1079791200 45900 0 %z} {1096725600 49500 1 %z} {1111240800 45900 0 %z} {1128175200 49500 1 %z} {1142690400 45900 0 %z} {1159624800 49500 1 %z} {1174140000 45900 0 %z} {1191074400 49500 1 %z} {1207404000 45900 0 %z} {1222524000 49500 1 %z} {1238853600 45900 0 %z} {1253973600 49500 1 %z} {1270303200 45900 0 %z} {1285423200 49500 1 %z} {1301752800 45900 0 %z} {1316872800 49500 1 %z} {1333202400 45900 0 %z} {1348927200 49500 1 %z} {1365256800 45900 0 %z} {1380376800 49500 1 %z} {1396706400 45900 0 %z} {1411826400 49500 1 %z} {1428156000 45900 0 %z} {1443276000 49500 1 %z} {1459605600 45900 0 %z} {1474725600 49500 1 %z} {1491055200 45900 0 %z} {1506175200 49500 1 %z} {1522504800 45900 0 %z} {1538229600 49500 1 %z} {1554559200 45900 0 %z} {1569679200 49500 1 %z} {1586008800 45900 0 %z} {1601128800 49500 1 %z} {1617458400 45900 0 %z} {1632578400 49500 1 %z} {1648908000 45900 0 %z} {1664028000 49500 1 %z} {1680357600 45900 0 %z} {1695477600 49500 1 %z} {1712412000 45900 0 %z} {1727532000 49500 1 %z} {1743861600 45900 0 %z} {1758981600 49500 1 %z} {1775311200 45900 0 %z} {1790431200 49500 1 %z} {1806760800 45900 0 %z} {1821880800 49500 1 %z} {1838210400 45900 0 %z} {1853330400 49500 1 %z} {1869660000 45900 0 %z} {1885384800 49500 1 %z} {1901714400 45900 0 %z} {1916834400 49500 1 %z} {1933164000 45900 0 %z} {1948284000 49500 1 %z} {1964613600 45900 0 %z} {1979733600 49500 1 %z} {1996063200 45900 0 %z} {2011183200 49500 1 %z} {2027512800 45900 0 %z} {2042632800 49500 1 %z} {2058962400 45900 0 %z} {2074687200 49500 1 %z} {2091016800 45900 0 %z} {2106136800 49500 1 %z} {2122466400 45900 0 %z} {2137586400 49500 1 %z} {2153916000 45900 0 %z} {2169036000 49500 1 %z} {2185365600 45900 0 %z} {2200485600 49500 1 %z} {2216815200 45900 0 %z} {2232540000 49500 1 %z} {2248869600 45900 0 %z} {2263989600 49500 1 %z} {2280319200 45900 0 %z} {2295439200 49500 1 %z} {2311768800 45900 0 %z} {2326888800 49500 1 %z} {2343218400 45900 0 %z} {2358338400 49500 1 %z} {2374668000 45900 0 %z} {2389788000 49500 1 %z} {2406117600 45900 0 %z} {2421842400 49500 1 %z} {2438172000 45900 0 %z} {2453292000 49500 1 %z} {2469621600 45900 0 %z} {2484741600 49500 1 %z} {2501071200 45900 0 %z} {2516191200 49500 1 %z} {2532520800 45900 0 %z} {2547640800 49500 1 %z} {2563970400 45900 0 %z} {2579090400 49500 1 %z} {2596024800 45900 0 %z} {2611144800 49500 1 %z} {2627474400 45900 0 %z} {2642594400 49500 1 %z} {2658924000 45900 0 %z} {2674044000 49500 1 %z} {2690373600 45900 0 %z} {2705493600 49500 1 %z} {2721823200 45900 0 %z} {2736943200 49500 1 %z} {2753272800 45900 0 %z} {2768997600 49500 1 %z} {2785327200 45900 0 %z} {2800447200 49500 1 %z} {2816776800 45900 0 %z} {2831896800 49500 1 %z} {2848226400 45900 0 %z} {2863346400 49500 1 %z} {2879676000 45900 0 %z} {2894796000 49500 1 %z} {2911125600 45900 0 %z} {2926245600 49500 1 %z} {2942575200 45900 0 %z} {2958300000 49500 1 %z} {2974629600 45900 0 %z} {2989749600 49500 1 %z} {3006079200 45900 0 %z} {3021199200 49500 1 %z} {3037528800 45900 0 %z} {3052648800 49500 1 %z} {3068978400 45900 0 %z} {3084098400 49500 1 %z} {3100428000 45900 0 %z} {3116152800 49500 1 %z} {3132482400 45900 0 %z} {3147602400 49500 1 %z} {3163932000 45900 0 %z} {3179052000 49500 1 %z} {3195381600 45900 0 %z} {3210501600 49500 1 %z} {3226831200 45900 0 %z} {3241951200 49500 1 %z} {3258280800 45900 0 %z} {3273400800 49500 1 %z} {3289730400 45900 0 %z} {3305455200 49500 1 %z} {3321784800 45900 0 %z} {3336904800 49500 1 %z} {3353234400 45900 0 %z} {3368354400 49500 1 %z} {3384684000 45900 0 %z} {3399804000 49500 1 %z} {3416133600 45900 0 %z} {3431253600 49500 1 %z} {3447583200 45900 0 %z} {3462703200 49500 1 %z} {3479637600 45900 0 %z} {3494757600 49500 1 %z} {3511087200 45900 0 %z} {3526207200 49500 1 %z} {3542536800 45900 0 %z} {3557656800 49500 1 %z} {3573986400 45900 0 %z} {3589106400 49500 1 %z} {3605436000 45900 0 %z} {3620556000 49500 1 %z} {3636885600 45900 0 %z} {3652610400 49500 1 %z} {3668940000 45900 0 %z} {3684060000 49500 1 %z} {3700389600 45900 0 %z} {3715509600 49500 1 %z} {3731839200 45900 0 %z} {3746959200 49500 1 %z} {3763288800 45900 0 %z} {3778408800 49500 1 %z} {3794738400 45900 0 %z} {3809858400 49500 1 %z} {3826188000 45900 0 %z} {3841912800 49500 1 %z} {3858242400 45900 0 %z} {3873362400 49500 1 %z} {3889692000 45900 0 %z} {3904812000 49500 1 %z} {3921141600 45900 0 %z} {3936261600 49500 1 %z} {3952591200 45900 0 %z} {3967711200 49500 1 %z} {3984040800 45900 0 %z} {3999765600 49500 1 %z} {4016095200 45900 0 %z} {4031215200 49500 1 %z} {4047544800 45900 0 %z} {4062664800 49500 1 %z} {4078994400 45900 0 %z} {4094114400 49500 1 %z} } |
Changes to library/tzdata/Pacific/Easter.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Easter) { {-9223372036854775808 -26248 0 LMT} {-2524495352 -26248 0 EMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Easter) { {-9223372036854775808 -26248 0 LMT} {-2524495352 -26248 0 EMT} {-1178124152 -25200 0 %z} {-36619200 -21600 1 %z} {-23922000 -25200 0 %z} {-3355200 -21600 1 %z} {7527600 -25200 0 %z} {24465600 -21600 1 %z} {37767600 -25200 0 %z} {55915200 -21600 1 %z} {69217200 -25200 0 %z} {87969600 -21600 1 %z} {100666800 -25200 0 %z} {118209600 -21600 1 %z} {132116400 -25200 0 %z} {150868800 -21600 1 %z} {163566000 -25200 0 %z} {182318400 -21600 1 %z} {195620400 -25200 0 %z} {213768000 -21600 1 %z} {227070000 -25200 0 %z} {245217600 -21600 1 %z} {258519600 -25200 0 %z} {277272000 -21600 1 %z} {289969200 -25200 0 %z} {308721600 -21600 1 %z} {321418800 -25200 0 %z} {340171200 -21600 1 %z} {353473200 -25200 0 %z} {371620800 -21600 1 %z} {384922800 -21600 0 %z} {403070400 -18000 1 %z} {416372400 -21600 0 %z} {434520000 -18000 1 %z} {447822000 -21600 0 %z} {466574400 -18000 1 %z} {479271600 -21600 0 %z} {498024000 -18000 1 %z} {510721200 -21600 0 %z} {529473600 -18000 1 %z} {545194800 -21600 0 %z} {560923200 -18000 1 %z} {574225200 -21600 0 %z} {592372800 -18000 1 %z} {605674800 -21600 0 %z} {624427200 -18000 1 %z} {637124400 -21600 0 %z} {653457600 -18000 1 %z} {668574000 -21600 0 %z} {687326400 -18000 1 %z} {700628400 -21600 0 %z} {718776000 -18000 1 %z} {732078000 -21600 0 %z} {750225600 -18000 1 %z} {763527600 -21600 0 %z} {781675200 -18000 1 %z} {794977200 -21600 0 %z} {813729600 -18000 1 %z} {826426800 -21600 0 %z} {845179200 -18000 1 %z} {859690800 -21600 0 %z} {876628800 -18000 1 %z} {889930800 -21600 0 %z} {906868800 -18000 1 %z} {923194800 -21600 0 %z} {939528000 -18000 1 %z} {952830000 -21600 0 %z} {971582400 -18000 1 %z} {984279600 -21600 0 %z} {1003032000 -18000 1 %z} {1015729200 -21600 0 %z} {1034481600 -18000 1 %z} {1047178800 -21600 0 %z} {1065931200 -18000 1 %z} {1079233200 -21600 0 %z} {1097380800 -18000 1 %z} {1110682800 -21600 0 %z} {1128830400 -18000 1 %z} {1142132400 -21600 0 %z} {1160884800 -18000 1 %z} {1173582000 -21600 0 %z} {1192334400 -18000 1 %z} {1206846000 -21600 0 %z} {1223784000 -18000 1 %z} {1237086000 -21600 0 %z} {1255233600 -18000 1 %z} {1270350000 -21600 0 %z} {1286683200 -18000 1 %z} {1304823600 -21600 0 %z} {1313899200 -18000 1 %z} {1335668400 -21600 0 %z} {1346558400 -18000 1 %z} {1367118000 -21600 0 %z} {1378612800 -18000 1 %z} {1398567600 -21600 0 %z} {1410062400 -18000 1 %z} {1463281200 -21600 0 %z} {1471147200 -18000 1 %z} {1494730800 -21600 0 %z} {1502596800 -18000 1 %z} {1526180400 -21600 0 %z} {1534046400 -18000 1 %z} {1554606000 -21600 0 %z} {1567915200 -18000 1 %z} {1586055600 -21600 0 %z} {1599364800 -18000 1 %z} {1617505200 -21600 0 %z} {1630814400 -18000 1 %z} {1648954800 -21600 0 %z} {1662868800 -18000 1 %z} {1680404400 -21600 0 %z} {1693713600 -18000 1 %z} {1712458800 -21600 0 %z} {1725768000 -18000 1 %z} {1743908400 -21600 0 %z} {1757217600 -18000 1 %z} {1775358000 -21600 0 %z} {1788667200 -18000 1 %z} {1806807600 -21600 0 %z} {1820116800 -18000 1 %z} {1838257200 -21600 0 %z} {1851566400 -18000 1 %z} {1870311600 -21600 0 %z} {1883016000 -18000 1 %z} {1901761200 -21600 0 %z} {1915070400 -18000 1 %z} {1933210800 -21600 0 %z} {1946520000 -18000 1 %z} {1964660400 -21600 0 %z} {1977969600 -18000 1 %z} {1996110000 -21600 0 %z} {2009419200 -18000 1 %z} {2027559600 -21600 0 %z} {2040868800 -18000 1 %z} {2059614000 -21600 0 %z} {2072318400 -18000 1 %z} {2091063600 -21600 0 %z} {2104372800 -18000 1 %z} {2122513200 -21600 0 %z} {2135822400 -18000 1 %z} {2153962800 -21600 0 %z} {2167272000 -18000 1 %z} {2185412400 -21600 0 %z} {2198721600 -18000 1 %z} {2217466800 -21600 0 %z} {2230171200 -18000 1 %z} {2248916400 -21600 0 %z} {2262225600 -18000 1 %z} {2280366000 -21600 0 %z} {2293675200 -18000 1 %z} {2311815600 -21600 0 %z} {2325124800 -18000 1 %z} {2343265200 -21600 0 %z} {2356574400 -18000 1 %z} {2374714800 -21600 0 %z} {2388024000 -18000 1 %z} {2406769200 -21600 0 %z} {2419473600 -18000 1 %z} {2438218800 -21600 0 %z} {2451528000 -18000 1 %z} {2469668400 -21600 0 %z} {2482977600 -18000 1 %z} {2501118000 -21600 0 %z} {2514427200 -18000 1 %z} {2532567600 -21600 0 %z} {2545876800 -18000 1 %z} {2564017200 -21600 0 %z} {2577326400 -18000 1 %z} {2596071600 -21600 0 %z} {2609380800 -18000 1 %z} {2627521200 -21600 0 %z} {2640830400 -18000 1 %z} {2658970800 -21600 0 %z} {2672280000 -18000 1 %z} {2690420400 -21600 0 %z} {2703729600 -18000 1 %z} {2721870000 -21600 0 %z} {2735179200 -18000 1 %z} {2753924400 -21600 0 %z} {2766628800 -18000 1 %z} {2785374000 -21600 0 %z} {2798683200 -18000 1 %z} {2816823600 -21600 0 %z} {2830132800 -18000 1 %z} {2848273200 -21600 0 %z} {2861582400 -18000 1 %z} {2879722800 -21600 0 %z} {2893032000 -18000 1 %z} {2911172400 -21600 0 %z} {2924481600 -18000 1 %z} {2943226800 -21600 0 %z} {2955931200 -18000 1 %z} {2974676400 -21600 0 %z} {2987985600 -18000 1 %z} {3006126000 -21600 0 %z} {3019435200 -18000 1 %z} {3037575600 -21600 0 %z} {3050884800 -18000 1 %z} {3069025200 -21600 0 %z} {3082334400 -18000 1 %z} {3101079600 -21600 0 %z} {3113784000 -18000 1 %z} {3132529200 -21600 0 %z} {3145838400 -18000 1 %z} {3163978800 -21600 0 %z} {3177288000 -18000 1 %z} {3195428400 -21600 0 %z} {3208737600 -18000 1 %z} {3226878000 -21600 0 %z} {3240187200 -18000 1 %z} {3258327600 -21600 0 %z} {3271636800 -18000 1 %z} {3290382000 -21600 0 %z} {3303086400 -18000 1 %z} {3321831600 -21600 0 %z} {3335140800 -18000 1 %z} {3353281200 -21600 0 %z} {3366590400 -18000 1 %z} {3384730800 -21600 0 %z} {3398040000 -18000 1 %z} {3416180400 -21600 0 %z} {3429489600 -18000 1 %z} {3447630000 -21600 0 %z} {3460939200 -18000 1 %z} {3479684400 -21600 0 %z} {3492993600 -18000 1 %z} {3511134000 -21600 0 %z} {3524443200 -18000 1 %z} {3542583600 -21600 0 %z} {3555892800 -18000 1 %z} {3574033200 -21600 0 %z} {3587342400 -18000 1 %z} {3605482800 -21600 0 %z} {3618792000 -18000 1 %z} {3637537200 -21600 0 %z} {3650241600 -18000 1 %z} {3668986800 -21600 0 %z} {3682296000 -18000 1 %z} {3700436400 -21600 0 %z} {3713745600 -18000 1 %z} {3731886000 -21600 0 %z} {3745195200 -18000 1 %z} {3763335600 -21600 0 %z} {3776644800 -18000 1 %z} {3794785200 -21600 0 %z} {3808094400 -18000 1 %z} {3826839600 -21600 0 %z} {3839544000 -18000 1 %z} {3858289200 -21600 0 %z} {3871598400 -18000 1 %z} {3889738800 -21600 0 %z} {3903048000 -18000 1 %z} {3921188400 -21600 0 %z} {3934497600 -18000 1 %z} {3952638000 -21600 0 %z} {3965947200 -18000 1 %z} {3984692400 -21600 0 %z} {3997396800 -18000 1 %z} {4016142000 -21600 0 %z} {4029451200 -18000 1 %z} {4047591600 -21600 0 %z} {4060900800 -18000 1 %z} {4079041200 -21600 0 %z} {4092350400 -18000 1 %z} } |
Changes to library/tzdata/Pacific/Efate.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Efate) { {-9223372036854775808 40396 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Efate) { {-9223372036854775808 40396 0 LMT} {-1829387596 39600 0 %z} {125409600 43200 1 %z} {133876800 39600 0 %z} {433256400 43200 1 %z} {448977600 39600 0 %z} {464706000 43200 1 %z} {480427200 39600 0 %z} {496760400 43200 1 %z} {511876800 39600 0 %z} {528210000 43200 1 %z} {543931200 39600 0 %z} {559659600 43200 1 %z} {575380800 39600 0 %z} {591109200 43200 1 %z} {606830400 39600 0 %z} {622558800 43200 1 %z} {638280000 39600 0 %z} {654008400 43200 1 %z} {669729600 39600 0 %z} {686062800 43200 1 %z} {696340800 39600 0 %z} {719931600 43200 1 %z} {727790400 39600 0 %z} } |
Changes to library/tzdata/Pacific/Fakaofo.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Fakaofo) { {-9223372036854775808 -41096 0 LMT} | | | | 1 2 3 4 5 6 7 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Fakaofo) { {-9223372036854775808 -41096 0 LMT} {-2177411704 -39600 0 %z} {1325242800 46800 0 %z} } |
Changes to library/tzdata/Pacific/Fiji.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Fiji) { {-9223372036854775808 42944 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Fiji) { {-9223372036854775808 42944 0 LMT} {-1709985344 43200 0 %z} {909842400 46800 1 %z} {920124000 43200 0 %z} {941896800 46800 1 %z} {951573600 43200 0 %z} {1259416800 46800 1 %z} {1269698400 43200 0 %z} {1287842400 46800 1 %z} {1299333600 43200 0 %z} {1319292000 46800 1 %z} {1327154400 43200 0 %z} {1350741600 46800 1 %z} {1358604000 43200 0 %z} {1382796000 46800 1 %z} {1390050000 43200 0 %z} {1414850400 46800 1 %z} {1421503200 43200 0 %z} {1446300000 46800 1 %z} {1452952800 43200 0 %z} {1478354400 46800 1 %z} {1484402400 43200 0 %z} {1509804000 46800 1 %z} {1515852000 43200 0 %z} {1541253600 46800 1 %z} {1547301600 43200 0 %z} {1573308000 46800 1 %z} {1578751200 43200 0 %z} {1608386400 46800 1 %z} {1610805600 43200 0 %z} } |
Changes to library/tzdata/Pacific/Galapagos.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Galapagos) { {-9223372036854775808 -21504 0 LMT} | | | | | | 1 2 3 4 5 6 7 8 9 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Galapagos) { {-9223372036854775808 -21504 0 LMT} {-1230746496 -18000 0 %z} {504939600 -21600 0 %z} {722930400 -18000 1 %z} {728888400 -21600 0 %z} } |
Changes to library/tzdata/Pacific/Gambier.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Gambier) { {-9223372036854775808 -32388 0 LMT} | | | 1 2 3 4 5 6 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Gambier) { {-9223372036854775808 -32388 0 LMT} {-1806678012 -32400 0 %z} } |
Changes to library/tzdata/Pacific/Guadalcanal.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Guadalcanal) { {-9223372036854775808 38388 0 LMT} | | | 1 2 3 4 5 6 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Guadalcanal) { {-9223372036854775808 38388 0 LMT} {-1806748788 39600 0 %z} } |
Changes to library/tzdata/Pacific/Guam.
1 2 3 4 5 6 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Guam) { {-9223372036854775808 -51660 0 LMT} {-3944626740 34740 0 LMT} {-2177487540 36000 0 GST} | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Guam) { {-9223372036854775808 -51660 0 LMT} {-3944626740 34740 0 LMT} {-2177487540 36000 0 GST} {-885549600 32400 0 %z} {-802256400 36000 0 GST} {-331891200 39600 1 GDT} {-281610000 36000 0 GST} {-73728000 39600 1 GDT} {-29415540 36000 0 GST} {-16704000 39600 1 GDT} {-10659600 36000 0 GST} |
︙ | ︙ |
Changes to library/tzdata/Pacific/Kanton.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Kanton) { {-9223372036854775808 0 0 -00} | | | | | 1 2 3 4 5 6 7 8 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Kanton) { {-9223372036854775808 0 0 -00} {-1020470400 -43200 0 %z} {307627200 -39600 0 %z} {788871600 46800 0 %z} } |
Changes to library/tzdata/Pacific/Kiritimati.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Kiritimati) { {-9223372036854775808 -37760 0 LMT} | | | | | 1 2 3 4 5 6 7 8 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Kiritimati) { {-9223372036854775808 -37760 0 LMT} {-2177415040 -38400 0 %z} {307622400 -36000 0 %z} {788868000 50400 0 %z} } |
Changes to library/tzdata/Pacific/Kosrae.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Kosrae) { {-9223372036854775808 -47284 0 LMT} {-3944631116 39116 0 LMT} | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Kosrae) { {-9223372036854775808 -47284 0 LMT} {-3944631116 39116 0 LMT} {-2177491916 39600 0 %z} {-1743678000 32400 0 %z} {-1606813200 39600 0 %z} {-1041418800 36000 0 %z} {-907408800 32400 0 %z} {-770634000 39600 0 %z} {-7988400 43200 0 %z} {915105600 39600 0 %z} } |
Changes to library/tzdata/Pacific/Kwajalein.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Kwajalein) { {-9223372036854775808 40160 0 LMT} | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Kwajalein) { {-9223372036854775808 40160 0 LMT} {-2177492960 39600 0 %z} {-1041418800 36000 0 %z} {-907408800 32400 0 %z} {-817462800 39600 0 %z} {-7988400 -43200 0 %z} {745934400 43200 0 %z} } |
Changes to library/tzdata/Pacific/Marquesas.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Marquesas) { {-9223372036854775808 -33480 0 LMT} | | | 1 2 3 4 5 6 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Marquesas) { {-9223372036854775808 -33480 0 LMT} {-1806676920 -34200 0 %z} } |
Changes to library/tzdata/Pacific/Nauru.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Nauru) { {-9223372036854775808 40060 0 LMT} | | | | | | 1 2 3 4 5 6 7 8 9 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Nauru) { {-9223372036854775808 40060 0 LMT} {-1545131260 41400 0 %z} {-862918200 32400 0 %z} {-767350800 41400 0 %z} {287418600 43200 0 %z} } |
Changes to library/tzdata/Pacific/Niue.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Niue) { {-9223372036854775808 -40780 0 LMT} | | | | 1 2 3 4 5 6 7 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Niue) { {-9223372036854775808 -40780 0 LMT} {-543069620 -40800 0 %z} {-173623200 -39600 0 %z} } |
Changes to library/tzdata/Pacific/Norfolk.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Norfolk) { {-9223372036854775808 40312 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Norfolk) { {-9223372036854775808 40312 0 LMT} {-2177493112 40320 0 %z} {-599656320 41400 0 %z} {152029800 45000 1 %z} {162916200 41400 0 %z} {1443882600 39600 0 %z} {1561899600 39600 0 %z} {1570287600 43200 1 %z} {1586012400 39600 0 %z} {1601737200 43200 1 %z} {1617462000 39600 0 %z} {1633186800 43200 1 %z} {1648911600 39600 0 %z} {1664636400 43200 1 %z} {1680361200 39600 0 %z} {1696086000 43200 1 %z} {1712415600 39600 0 %z} {1728140400 43200 1 %z} {1743865200 39600 0 %z} {1759590000 43200 1 %z} {1775314800 39600 0 %z} {1791039600 43200 1 %z} {1806764400 39600 0 %z} {1822489200 43200 1 %z} {1838214000 39600 0 %z} {1853938800 43200 1 %z} {1869663600 39600 0 %z} {1885993200 43200 1 %z} {1901718000 39600 0 %z} {1917442800 43200 1 %z} {1933167600 39600 0 %z} {1948892400 43200 1 %z} {1964617200 39600 0 %z} {1980342000 43200 1 %z} {1996066800 39600 0 %z} {2011791600 43200 1 %z} {2027516400 39600 0 %z} {2043241200 43200 1 %z} {2058966000 39600 0 %z} {2075295600 43200 1 %z} {2091020400 39600 0 %z} {2106745200 43200 1 %z} {2122470000 39600 0 %z} {2138194800 43200 1 %z} {2153919600 39600 0 %z} {2169644400 43200 1 %z} {2185369200 39600 0 %z} {2201094000 43200 1 %z} {2216818800 39600 0 %z} {2233148400 43200 1 %z} {2248873200 39600 0 %z} {2264598000 43200 1 %z} {2280322800 39600 0 %z} {2296047600 43200 1 %z} {2311772400 39600 0 %z} {2327497200 43200 1 %z} {2343222000 39600 0 %z} {2358946800 43200 1 %z} {2374671600 39600 0 %z} {2390396400 43200 1 %z} {2406121200 39600 0 %z} {2422450800 43200 1 %z} {2438175600 39600 0 %z} {2453900400 43200 1 %z} {2469625200 39600 0 %z} {2485350000 43200 1 %z} {2501074800 39600 0 %z} {2516799600 43200 1 %z} {2532524400 39600 0 %z} {2548249200 43200 1 %z} {2563974000 39600 0 %z} {2579698800 43200 1 %z} {2596028400 39600 0 %z} {2611753200 43200 1 %z} {2627478000 39600 0 %z} {2643202800 43200 1 %z} {2658927600 39600 0 %z} {2674652400 43200 1 %z} {2690377200 39600 0 %z} {2706102000 43200 1 %z} {2721826800 39600 0 %z} {2737551600 43200 1 %z} {2753276400 39600 0 %z} {2769606000 43200 1 %z} {2785330800 39600 0 %z} {2801055600 43200 1 %z} {2816780400 39600 0 %z} {2832505200 43200 1 %z} {2848230000 39600 0 %z} {2863954800 43200 1 %z} {2879679600 39600 0 %z} {2895404400 43200 1 %z} {2911129200 39600 0 %z} {2926854000 43200 1 %z} {2942578800 39600 0 %z} {2958908400 43200 1 %z} {2974633200 39600 0 %z} {2990358000 43200 1 %z} {3006082800 39600 0 %z} {3021807600 43200 1 %z} {3037532400 39600 0 %z} {3053257200 43200 1 %z} {3068982000 39600 0 %z} {3084706800 43200 1 %z} {3100431600 39600 0 %z} {3116761200 43200 1 %z} {3132486000 39600 0 %z} {3148210800 43200 1 %z} {3163935600 39600 0 %z} {3179660400 43200 1 %z} {3195385200 39600 0 %z} {3211110000 43200 1 %z} {3226834800 39600 0 %z} {3242559600 43200 1 %z} {3258284400 39600 0 %z} {3274009200 43200 1 %z} {3289734000 39600 0 %z} {3306063600 43200 1 %z} {3321788400 39600 0 %z} {3337513200 43200 1 %z} {3353238000 39600 0 %z} {3368962800 43200 1 %z} {3384687600 39600 0 %z} {3400412400 43200 1 %z} {3416137200 39600 0 %z} {3431862000 43200 1 %z} {3447586800 39600 0 %z} {3463311600 43200 1 %z} {3479641200 39600 0 %z} {3495366000 43200 1 %z} {3511090800 39600 0 %z} {3526815600 43200 1 %z} {3542540400 39600 0 %z} {3558265200 43200 1 %z} {3573990000 39600 0 %z} {3589714800 43200 1 %z} {3605439600 39600 0 %z} {3621164400 43200 1 %z} {3636889200 39600 0 %z} {3653218800 43200 1 %z} {3668943600 39600 0 %z} {3684668400 43200 1 %z} {3700393200 39600 0 %z} {3716118000 43200 1 %z} {3731842800 39600 0 %z} {3747567600 43200 1 %z} {3763292400 39600 0 %z} {3779017200 43200 1 %z} {3794742000 39600 0 %z} {3810466800 43200 1 %z} {3826191600 39600 0 %z} {3842521200 43200 1 %z} {3858246000 39600 0 %z} {3873970800 43200 1 %z} {3889695600 39600 0 %z} {3905420400 43200 1 %z} {3921145200 39600 0 %z} {3936870000 43200 1 %z} {3952594800 39600 0 %z} {3968319600 43200 1 %z} {3984044400 39600 0 %z} {4000374000 43200 1 %z} {4016098800 39600 0 %z} {4031823600 43200 1 %z} {4047548400 39600 0 %z} {4063273200 43200 1 %z} {4078998000 39600 0 %z} {4094722800 43200 1 %z} } |
Changes to library/tzdata/Pacific/Noumea.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Noumea) { {-9223372036854775808 39948 0 LMT} | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Noumea) { {-9223372036854775808 39948 0 LMT} {-1829387148 39600 0 %z} {250002000 43200 1 %z} {257342400 39600 0 %z} {281451600 43200 1 %z} {288878400 39600 0 %z} {849366000 43200 1 %z} {857228400 39600 0 %z} } |
Changes to library/tzdata/Pacific/Palau.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Palau) { {-9223372036854775808 -54124 0 LMT} {-3944624276 32276 0 LMT} | | | 1 2 3 4 5 6 7 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Palau) { {-9223372036854775808 -54124 0 LMT} {-3944624276 32276 0 LMT} {-2177485076 32400 0 %z} } |
Changes to library/tzdata/Pacific/Pitcairn.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Pitcairn) { {-9223372036854775808 -31220 0 LMT} | | | | 1 2 3 4 5 6 7 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Pitcairn) { {-9223372036854775808 -31220 0 LMT} {-2177421580 -30600 0 %z} {893665800 -28800 0 %z} } |
Changes to library/tzdata/Pacific/Port_Moresby.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Port_Moresby) { {-9223372036854775808 35320 0 LMT} {-2840176120 35312 0 PMMT} | | | 1 2 3 4 5 6 7 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Port_Moresby) { {-9223372036854775808 35320 0 LMT} {-2840176120 35312 0 PMMT} {-2366790512 36000 0 %z} } |
Changes to library/tzdata/Pacific/Rarotonga.
1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Rarotonga) { {-9223372036854775808 48056 0 LMT} {-2209555256 -38344 0 LMT} | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Rarotonga) { {-9223372036854775808 48056 0 LMT} {-2209555256 -38344 0 LMT} {-543072056 -37800 0 %z} {279714600 -34200 0 %z} {289387800 -36000 0 %z} {309952800 -34200 1 %z} {320837400 -36000 0 %z} {341402400 -34200 1 %z} {352287000 -36000 0 %z} {372852000 -34200 1 %z} {384341400 -36000 0 %z} {404906400 -34200 1 %z} {415791000 -36000 0 %z} {436356000 -34200 1 %z} {447240600 -36000 0 %z} {467805600 -34200 1 %z} {478690200 -36000 0 %z} {499255200 -34200 1 %z} {510139800 -36000 0 %z} {530704800 -34200 1 %z} {541589400 -36000 0 %z} {562154400 -34200 1 %z} {573643800 -36000 0 %z} {594208800 -34200 1 %z} {605093400 -36000 0 %z} {625658400 -34200 1 %z} {636543000 -36000 0 %z} {657108000 -34200 1 %z} {667992600 -36000 0 %z} } |
Changes to library/tzdata/Pacific/Tahiti.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Tahiti) { {-9223372036854775808 -35896 0 LMT} | | | 1 2 3 4 5 6 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Tahiti) { {-9223372036854775808 -35896 0 LMT} {-1806674504 -36000 0 %z} } |
Changes to library/tzdata/Pacific/Tarawa.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Tarawa) { {-9223372036854775808 41524 0 LMT} | | | 1 2 3 4 5 6 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Tarawa) { {-9223372036854775808 41524 0 LMT} {-2177494324 43200 0 %z} } |
Changes to library/tzdata/Pacific/Tongatapu.
1 2 3 4 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Tongatapu) { {-9223372036854775808 44352 0 LMT} | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # created by tools/tclZIC.tcl - do not edit set TZData(:Pacific/Tongatapu) { {-9223372036854775808 44352 0 LMT} {-767189952 44400 0 %z} {-284041200 46800 0 %z} {915102000 46800 0 %z} {939214800 50400 1 %z} {953384400 46800 0 %z} {973342800 50400 1 %z} {980596800 46800 0 %z} {1004792400 50400 1 %z} {1012046400 46800 0 %z} {1478350800 50400 1 %z} {1484398800 46800 0 %z} } |
Changes to library/tzdata/WET.
1 | # created by tools/tclZIC.tcl - do not edit | > > | | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 1 2 3 4 5 | # created by tools/tclZIC.tcl - do not edit if {![info exists TZData(Europe/Lisbon)]} { LoadTimeZoneFile Europe/Lisbon } set TZData(:WET) $TZData(:Europe/Lisbon) |
Changes to macosx/tclMacOSXNotify.c.
︙ | ︙ | |||
1772 1773 1774 1775 1776 1777 1778 | #ifndef _DARWIN_C_SOURCE /* * Sanity check fd. */ if (fd >= FD_SETSIZE) { | | | 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 | #ifndef _DARWIN_C_SOURCE /* * Sanity check fd. */ if (fd >= FD_SETSIZE) { Tcl_Panic("TclUnixWaitForFile cannot handle file id %d", fd); /* must never get here, or select masks overrun will occur below */ } #endif /* * If there is a non-zero finite timeout, compute the time when we give * up. |
︙ | ︙ |
Added tests-perf/file.perf.tcl.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | #!/usr/bin/tclsh # ------------------------------------------------------------------------ # # file.perf.tcl -- # # This file provides performance tests for comparison of tcl-speed # of file commands and subsystem. # # ------------------------------------------------------------------------ # # Copyright (c) 2024 Serg G. Brester (aka sebres) # # See the file "license.terms" for information on usage and redistribution # of this file. # if {![namespace exists ::tclTestPerf]} { source -encoding utf-8 [file join [file dirname [info script]] test-performance.tcl] } namespace eval ::tclTestPerf-File { namespace path {::tclTestPerf} proc _get_new_file_path_obj [list [list p [info script]]] { # always generate new string object here (ensure it is not a "cached" object of type path): string trimright "$p "; # costs of object "creation" smaller than 1 microsecond } # regression tests for bug-02d5d65d70adab97 (fix for [02d5d65d70adab97]): proc test-file-access-regress {{reptime 1000}} { _test_run -no-result $reptime { setup { set fn [::tclTestPerf-File::_get_new_file_path_obj] } # file exists on "cached" file path: { file exists $fn } # file exists on not "cached" (fresh generated) file path: { set fn [::tclTestPerf-File::_get_new_file_path_obj]; file exists $fn } setup { set fn [::tclTestPerf-File::_get_new_file_path_obj] } # file attributes on "cached" file path: { file attributes $fn -readonly } # file attributes on not "cached" (fresh generated) file path: { set fn [::tclTestPerf-File::_get_new_file_path_obj]; file attributes $fn -readonly } setup { set fn [::tclTestPerf-File::_get_new_file_path_obj] } # file stat on "cached" file path: { file stat $fn st } # file stat on not "cached" (fresh generated) file path: { set fn [::tclTestPerf-File::_get_new_file_path_obj]; file stat $fn st } setup { set fn [::tclTestPerf-File::_get_new_file_path_obj] } # touch on "cached" file path: { close [open $fn rb] } # touch on not "cached" (fresh generated) file path: { set fn [::tclTestPerf-File::_get_new_file_path_obj]; close [open $fn rb] } } } proc test {{reptime 1000}} { test-file-access-regress $reptime puts \n**OK** } }; # end of ::tclTestPerf-File # ------------------------------------------------------------------------ # if calling direct: if {[info exists ::argv0] && [file tail $::argv0] eq [file tail [info script]]} { array set in {-time 500} array set in $argv ::tclTestPerf-File::test $in(-time) } |
Changes to tests/clock.test.
︙ | ︙ | |||
279 280 281 282 283 284 285 | set i [interp create]; # because clock can be used somewhere, test it in new interp: } -body { $i eval { lappend ret ens:[namespace ensemble exists ::clock] clock seconds; # init ensemble (but not yet stubs, loading of clock.tcl retarded) lappend ret ens:[namespace ensemble exists ::clock] lappend ret stubs:[expr {[namespace which -command ::tcl::clock::GetSystemTimeZone] ne ""}] | | | | | | | 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 | set i [interp create]; # because clock can be used somewhere, test it in new interp: } -body { $i eval { lappend ret ens:[namespace ensemble exists ::clock] clock seconds; # init ensemble (but not yet stubs, loading of clock.tcl retarded) lappend ret ens:[namespace ensemble exists ::clock] lappend ret stubs:[expr {[namespace which -command ::tcl::clock::GetSystemTimeZone] ne ""}] clock format now; # clock.tcl stubs expected lappend ret stubs:[expr {[namespace which -command ::tcl::clock::GetSystemTimeZone] ne ""}] } } -cleanup { interp delete $i } -result {ens:1 ens:1 stubs:0 stubs:1} test clock-0.1a "initial: safe interpreter shares clock command with parent" -setup { set i [interp create] $i eval {set sci [interp create -safe]} } -body { $i eval { lappend ret ens:[namespace ensemble exists ::clock] $sci eval { clock seconds }; # init ensemble (but not yet stubs, loading of clock.tcl retarded) lappend ret ens:[namespace ensemble exists ::clock] lappend ret stubs:[expr {[namespace which -command ::tcl::clock::GetSystemTimeZone] ne ""}] $sci eval { clock format now }; # clock.tcl stubs expected lappend ret stubs:[expr {[namespace which -command ::tcl::clock::GetSystemTimeZone] ne ""}] } } -cleanup { interp delete $i } -result {ens:1 ens:1 stubs:0 stubs:1} test clock-0.2 "initial: loading of format/locale does not overwrite interp state (errorInfo)" -setup { # be sure - we have no cached locale/msgcat, etc: if {[namespace which -command ::tcl::clock::ClearCaches] ne ""} { ::tcl::clock::ClearCaches } } -body { if {[catch { return -level 0 -code error -errorcode {EXPERR TEST-ERROR} -errorinfo "ERROR expected error" test }]} { clock format now -locale de; # should not overwrite error code/info list $::errorCode $::errorInfo } } -result {{EXPERR TEST-ERROR} {ERROR expected error}} # Test some of the basics of [clock format] set syntax "clockval|now ?-format string? ?-gmt boolean? ?-locale LOCALE? ?-timezone ZONE?" test clock-1.0 "clock format - wrong # args" { list [catch {clock format} msg] $msg $::errorCode } [subst {1 {wrong # args: should be "clock format $syntax"} {CLOCK wrongNumArgs}}] test clock-1.0.1 "clock format - wrong # args (compiled ensemble with invalid syntax)" { list [catch {clock format 0 -too-few-options-4-test} msg] $msg $::errorCode } [subst {1 {wrong # args: should be "clock format $syntax"} {CLOCK wrongNumArgs}}] test clock-1.1 "clock format - bad time" { list [catch {clock format foo} msg opt] $msg [dict getd $opt -errorcode {}] } {1 {bad seconds "foo": must be now or integer} {CLOCK badOption foo}} test clock-1.2 "clock format - bad gmt val" { list [catch {clock format 0 -gmt foo} msg] $msg } {1 {expected boolean value but got "foo"}} test clock-1.3 "clock format - empty val" { clock format 0 -gmt 1 -format "" |
︙ | ︙ | |||
363 364 365 366 367 368 369 | clock format 0 -g true -f "%Y-%m-%d" } 1970-01-01 test clock-1.7.1 "clock format - command abbreviations (compat regression test)" { clock f 0 -g 1 -f "%Y-%m-%d" } 1970-01-01 | | | | 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 | clock format 0 -g true -f "%Y-%m-%d" } 1970-01-01 test clock-1.7.1 "clock format - command abbreviations (compat regression test)" { clock f 0 -g 1 -f "%Y-%m-%d" } 1970-01-01 test clock-1.8 "clock format now" { # give one second more for test (if on boundary of the current second): set n [clock format [clock seconds] -g 1 -f "%s"] expr {[clock format now -g 1 -f "%s"] in [list $n [incr n]]} } 1 test clock-1.9 "clock arguments: option doubly present" { list [catch {clock format 0 -gmt 1 -gmt 0} result] $result } {1 {bad option "-gmt": doubly present}} test clock-1.10 {clock format: text with token (bug [a858d95f4bfddafb])} { |
︙ | ︙ | |||
18700 18701 18702 18703 18704 18705 18706 | test clock-6.8 {input of seconds} { clock scan {9223372036854775807} -format %s -gmt true } 9223372036854775807 test clock-6.8b "clock scan - bad base" { list [catch {clock scan "" -base foo -gmt 1} msg opt] $msg [dict getd $opt -errorcode {}] | | | 18700 18701 18702 18703 18704 18705 18706 18707 18708 18709 18710 18711 18712 18713 18714 | test clock-6.8 {input of seconds} { clock scan {9223372036854775807} -format %s -gmt true } 9223372036854775807 test clock-6.8b "clock scan - bad base" { list [catch {clock scan "" -base foo -gmt 1} msg opt] $msg [dict getd $opt -errorcode {}] } {1 {bad seconds "foo": must be now or integer} {CLOCK badOption foo}} test clock-6.9 {input of seconds - overflow} { list [catch {clock scan -9223372036854775809 -format %s -gmt true} result opt] $result [dict getd $opt -errorcode ""] } {1 {integer value too large to represent} {CLOCK dateTooLarge}} test clock-6.10 {input of seconds - overflow} { list [catch {clock scan 9223372036854775808 -format %s -gmt true} result opt] $result [dict getd $opt -errorcode ""] } {1 {integer value too large to represent} {CLOCK dateTooLarge}} |
︙ | ︙ | |||
37150 37151 37152 37153 37154 37155 37156 | [clock scan "12:01 pm" -base 0 -gmt 1] } -result {60 43260} test clock-46.6 {freescan: regression test - bad time} -constraints valid_off \ -body { # 13:00 am/pm are invalid input strings... list [clock scan "13:00 am" -base 0 -gmt 1] \ [clock scan "13:00 pm" -base 0 -gmt 1] | | > > > > > > > > > > > > > > > > > > > > > > | > | < > | | < < | > > > | | | | | | | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 37150 37151 37152 37153 37154 37155 37156 37157 37158 37159 37160 37161 37162 37163 37164 37165 37166 37167 37168 37169 37170 37171 37172 37173 37174 37175 37176 37177 37178 37179 37180 37181 37182 37183 37184 37185 37186 37187 37188 37189 37190 37191 37192 37193 37194 37195 37196 37197 37198 37199 37200 37201 37202 37203 37204 37205 37206 37207 37208 37209 37210 37211 37212 37213 37214 37215 37216 37217 37218 37219 37220 37221 37222 37223 37224 37225 37226 37227 37228 37229 37230 37231 37232 37233 37234 37235 37236 37237 37238 37239 37240 37241 37242 37243 37244 37245 37246 37247 37248 37249 37250 37251 37252 37253 37254 37255 37256 37257 37258 37259 37260 37261 37262 37263 37264 37265 37266 37267 37268 37269 37270 37271 37272 37273 37274 37275 37276 37277 37278 37279 37280 37281 37282 | [clock scan "12:01 pm" -base 0 -gmt 1] } -result {60 43260} test clock-46.6 {freescan: regression test - bad time} -constraints valid_off \ -body { # 13:00 am/pm are invalid input strings... list [clock scan "13:00 am" -base 0 -gmt 1] \ [clock scan "13:00 pm" -base 0 -gmt 1] } -result {3600 46800} if {!$valid_mode} { test clock-46.7a {regression test - switch day by large not-valid time, see bug [3ee8f1c2a785f4d8]} {valid_off} { list [clock scan 23:59:59 -base 0 -gmt 1 -format %H:%M:%S] \ [clock scan 24:00:00 -base 0 -gmt 1 -format %H:%M:%S] \ [clock scan 48:00:00 -base 0 -gmt 1 -format %H:%M:%S] } {86399 86400 172800} test clock-46.7b {freescan: regression test - switch day by large not-valid time, see bug [3ee8f1c2a785f4d8]} {valid_off} { list [clock scan 23:59:59 -base 0 -gmt 1] \ [clock scan 24:00:00 -base 0 -gmt 1] \ [clock scan 48:00:00 -base 0 -gmt 1] } {86399 86400 172800} } else { test clock-46.8a {regression test - invalid time (hour)} { list [catch {clock scan 24:00:00 -base 0 -gmt 1 -format %H:%M:%S} msg] $msg \ [catch {clock scan 48:00:00 -base 0 -gmt 1 -format %H:%M:%S} msg] $msg } {1 {unable to convert input string: invalid time (hour)} 1 {unable to convert input string: invalid time (hour)}} test clock-46.8b {freescan: regression test - invalid time (hour)} { list [catch {clock scan 24:00:00 -base 0 -gmt 1} msg] $msg \ [catch {clock scan 48:00:00 -base 0 -gmt 1} msg] $msg } {1 {unable to convert input string: invalid time (hour)} 1 {unable to convert input string: invalid time (hour)}} } proc _invalid_test {testtz scnargs args} { global valid_mode # ensure validation works TZ independently, since the conversion # of local time to UTC may adjust date/time tokens, depending on TZ: set res {} if {$testtz eq ""} { set testtz {:GMT :CET {} :Europe/Berlin :localtime} } if {!$valid_mode} { # globally -valid 0, so add it explicitely lappend scnargs -valid 1 } foreach tz $testtz { foreach {v} $args { lappend res [catch {clock scan $v {*}$scnargs -timezone $tz} msg] $msg } } set res } # test without and with relative offsets: foreach {idx relstr} {"" "" "+rel" "+ 15 month + 40 days + 30 hours + 80 minutes +9999 seconds"} { test clock-46.10$idx {freescan: validation rules: invalid time} \ -body { # 13:00 am/pm are invalid input strings... _invalid_test {} {} "13:00 am$relstr" "13:00 pm$relstr" } -result [lrepeat 10 1 {unable to convert input string: invalid time (hour)}] test clock-46.11$idx {freescan: validation rules: invalid time} \ -body { # invalid minutes in input strings... _invalid_test {} {} "23:70$relstr" "11:80 pm$relstr" } -result [lrepeat 10 1 {unable to convert input string: invalid time (minutes)}] test clock-46.12$idx {freescan: validation rules: invalid time} \ -body { # invalid seconds in input strings... _invalid_test {} {} "23:00:70$relstr" "11:00:80 pm$relstr" } -result [lrepeat 10 1 {unable to convert input string: invalid time}] test clock-46.13$idx {freescan: validation rules: invalid day} \ -body { _invalid_test {} {} "29 Feb 2017$relstr" "30 Feb 2016$relstr" } -result [lrepeat 10 1 {unable to convert input string: invalid day}] test clock-46.14$idx {freescan: validation rules: invalid day} \ -body { _invalid_test {} {} "0 Feb 2017$relstr" "00 Feb 2017$relstr" } -result [lrepeat 10 1 {unable to convert input string: invalid day}] test clock-46.15$idx {freescan: validation rules: invalid month} \ -body { _invalid_test {} {} "13/13/2017$relstr" "00/00/2017$relstr" } -result [lrepeat 10 1 {unable to convert input string: invalid month}] test clock-46.16$idx {freescan: validation rules: invalid day of week} \ -body { _invalid_test {} {} "Sat Jan 02 00:00:00 1970$relstr" "Thu Jan 04 00:00:00 1970$relstr" } -result [lrepeat 10 1 {unable to convert input string: invalid day of week}] test clock-46.17$idx {scan: validation rules: invalid year} -setup { set orgcfg [list -min-year [::tcl::unsupported::clock::configure -min-year] -max-year [::tcl::unsupported::clock::configure -max-year] \ -year-century [::tcl::unsupported::clock::configure -year-century] -century-switch [::tcl::unsupported::clock::configure -century-switch]] ::tcl::unsupported::clock::configure -min-year 2000 -max-year 2100 -year-century 2000 -century-switch 38 } -body { _invalid_test {} {} "70-01-01$relstr" "1870-01-01$relstr" "9570-01-01$relstr" } -result [lrepeat 15 1 {unable to convert input string: invalid year}] -cleanup { ::tcl::unsupported::clock::configure {*}$orgcfg unset -nocomplain orgcfg } }; # foreach test clock-46.16-pos-fs {freescan: validation rules: valid day of week (must work for all weekdays)} \ -body { _invalid_test {:GMT -12:00 +12:00} {} {Sat, 01 Jan 2000 00:00:00} {Sun, 02 Jan 2000 00:00:00} {Mon, 03 Jan 2000 00:00:00} {Tue, 04 Jan 2000 00:00:00} {Wed, 05 Jan 2000 00:00:00} {Thu, 06 Jan 2000 00:00:00} {Fri, 07 Jan 2000 00:00:00} } -result [list \ 0 946684800 0 946771200 0 946857600 0 946944000 0 947030400 0 947116800 0 947203200 \ 0 946728000 0 946814400 0 946900800 0 946987200 0 947073600 0 947160000 0 947246400 \ 0 946641600 0 946728000 0 946814400 0 946900800 0 946987200 0 947073600 0 947160000 \ ] test clock-46.16-pos-fmt1 {scan with format: validation rules: valid day of week (must work for all weekdays)} \ -body { _invalid_test {:GMT -12:00 +12:00} {-format "%a, %d %b %Y %H:%M:%S"} {Sat, 01 Jan 2000 00:00:00} {Sun, 02 Jan 2000 00:00:00} {Mon, 03 Jan 2000 00:00:00} {Tue, 04 Jan 2000 00:00:00} {Wed, 05 Jan 2000 00:00:00} {Thu, 06 Jan 2000 00:00:00} {Fri, 07 Jan 2000 00:00:00} } -result [list \ 0 946684800 0 946771200 0 946857600 0 946944000 0 947030400 0 947116800 0 947203200 \ 0 946728000 0 946814400 0 946900800 0 946987200 0 947073600 0 947160000 0 947246400 \ 0 946641600 0 946728000 0 946814400 0 946900800 0 946987200 0 947073600 0 947160000 \ ] test clock-46.16-pos-fmt2 {scan with format: validation rules: valid day of week (must work for all weekdays)} \ -body { _invalid_test {:GMT -12:00 +12:00} {-format "%u, %d %b %Y %H:%M:%S"} {6, 01 Jan 2000 00:00:00} {7, 02 Jan 2000 00:00:00} {1, 03 Jan 2000 00:00:00} {2, 04 Jan 2000 00:00:00} {3, 05 Jan 2000 00:00:00} {4, 06 Jan 2000 00:00:00} {5, 07 Jan 2000 00:00:00} } -result [list \ 0 946684800 0 946771200 0 946857600 0 946944000 0 947030400 0 947116800 0 947203200 \ 0 946728000 0 946814400 0 946900800 0 946987200 0 947073600 0 947160000 0 947246400 \ 0 946641600 0 946728000 0 946814400 0 946900800 0 946987200 0 947073600 0 947160000 \ ] test clock-46.16-pos-fmt3 {scan with format: validation rules: valid day of week (must work for all weekdays)} \ -body { _invalid_test {:GMT -12:00 +12:00} {-format "%w, %d %b %Y %H:%M:%S"} {6, 01 Jan 2000 00:00:00} {0, 02 Jan 2000 00:00:00} {1, 03 Jan 2000 00:00:00} {2, 04 Jan 2000 00:00:00} {3, 05 Jan 2000 00:00:00} {4, 06 Jan 2000 00:00:00} {5, 07 Jan 2000 00:00:00} } -result [list \ 0 946684800 0 946771200 0 946857600 0 946944000 0 947030400 0 947116800 0 947203200 \ 0 946728000 0 946814400 0 946900800 0 946987200 0 947073600 0 947160000 0 947246400 \ 0 946641600 0 946728000 0 946814400 0 946900800 0 946987200 0 947073600 0 947160000 \ ] rename _invalid_test {} unset -nocomplain idx relstr set dst_hole_check { {":Europe/Berlin" "2017-03-26 01:59:59" "2017-03-26 02:00:00" "2017-03-26 02:59:59" "2017-03-26 03:00:00" "2017-10-29 01:59:59" "2017-10-29 02:00:00"} |
︙ | ︙ |
Changes to tests/cmdAH.test.
︙ | ︙ | |||
28 29 30 31 32 33 34 | }] testConstraint filetime64bit [expr { [testConstraint time64bit] && ( ![testConstraint unix] || [apply {{} { # check whether disk may have 2038 problem, see [fd91b0ca09cb171f]: set fn [makeFile "" foo.text] if {[catch { | | | 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | }] testConstraint filetime64bit [expr { [testConstraint time64bit] && ( ![testConstraint unix] || [apply {{} { # check whether disk may have 2038 problem, see [fd91b0ca09cb171f]: set fn [makeFile "" foo.text] if {[catch { exec sh -c "TZ=:UTC LC_TIME=en_US touch -ma -t '207006290000' '$fn' && TZ=:UTC LC_TIME=en_US ls -l '$fn'" } res]} { #puts "Check constraint failed:\t$res" set res {} } removeFile $fn regexp {\mJun\s+29\s+2070\M} $res }}] |
︙ | ︙ |
Changes to tests/compile.test.
︙ | ︙ | |||
488 489 490 491 492 493 494 495 496 497 498 499 500 | append code "\}$e" } #puts [format "%% %.40s ... %d bytes" $code [string length $code]] return $code }} } test compile-13.2 {TclCompileScript: testing expected nested scripts compilation} -setup { _ti_gencode interp recursionlimit ti [expr {10000+50}] ti eval {set result {}} } -body { # Test different compilation variants (instructions evalStk, invokeStk, etc), # with 1500 (1000 in debug) nested scripts (bodies). If you get SO/SF exceptions on some low-stack | > > > > > > > > | | 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 | append code "\}$e" } #puts [format "%% %.40s ... %d bytes" $code [string length $code]] return $code }} } test compile-13.2 {TclCompileScript: testing expected nested scripts compilation} -setup { # dynamic constraint - ensure the stack is large enough on this box for this test: if { [testConstraint unix] && ![catch { exec sh -c {ulimit -s} } stsz] && $stsz ne "unlimited" && $stsz <= 2048 } { tcltest::Skip "too small stack limit ($stsz <= 2048)" } _ti_gencode interp recursionlimit ti [expr {10000+50}] ti eval {set result {}} } -body { # Test different compilation variants (instructions evalStk, invokeStk, etc), # with 1500 (1000 in debug) nested scripts (bodies). If you get SO/SF exceptions on some low-stack # boxes or systems, please don't decrease it (either provide new or extend a constraint above) ti eval {foreach cmd {eval "if 1" try catch} { set c [gencode [expr {[tcl::build-info debug] ? 1500 : 1000}] $cmd] if 1 $c }} ti eval {set result} } -result {1 1 1 1} test compile-13.3 {TclCompileScript: testing check of max depth by nested scripts compilation} -setup { |
︙ | ︙ | |||
823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 | tcl::unsupported::disassemble objmethod foo bar } -cleanup { foo destroy } -match glob -result * # There never was a compile-18.20. # The keys of the dictionary produced by [getbytecode] are defined. set bytecodekeys {literals variables exception instructions auxiliary commands script namespace stackdepth exceptdepth} test compile-18.21 {disassembler - basics} -returnCodes error -body { tcl::unsupported::getbytecode } -match glob -result {wrong # args: should be "*"} test compile-18.22 {disassembler - basics} -returnCodes error -body { tcl::unsupported::getbytecode ? } -result "bad type \"?\": must be $disassemblables" test compile-18.23 {disassembler - basics} -returnCodes error -body { tcl::unsupported::getbytecode lambda } -match glob -result {wrong # args: should be "* lambda lambdaTerm"} test compile-18.24 {disassembler - basics} -returnCodes error -body { tcl::unsupported::getbytecode lambda \{ } -result "can't interpret \"\{\" as a lambda expression" test compile-18.25 {disassembler - basics} -body { dict keys [tcl::unsupported::getbytecode lambda {{} {}}] | > | | | | 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 | tcl::unsupported::disassemble objmethod foo bar } -cleanup { foo destroy } -match glob -result * # There never was a compile-18.20. # The keys of the dictionary produced by [getbytecode] are defined. set bytecodekeys {literals variables exception instructions auxiliary commands script namespace stackdepth exceptdepth} set allbytecodekeys [list {*}$bytecodekeys initiallinenumber sourcefile] test compile-18.21 {disassembler - basics} -returnCodes error -body { tcl::unsupported::getbytecode } -match glob -result {wrong # args: should be "*"} test compile-18.22 {disassembler - basics} -returnCodes error -body { tcl::unsupported::getbytecode ? } -result "bad type \"?\": must be $disassemblables" test compile-18.23 {disassembler - basics} -returnCodes error -body { tcl::unsupported::getbytecode lambda } -match glob -result {wrong # args: should be "* lambda lambdaTerm"} test compile-18.24 {disassembler - basics} -returnCodes error -body { tcl::unsupported::getbytecode lambda \{ } -result "can't interpret \"\{\" as a lambda expression" test compile-18.25 {disassembler - basics} -body { dict keys [tcl::unsupported::getbytecode lambda {{} {}}] } -result $allbytecodekeys test compile-18.26 {disassembler - basics} -returnCodes error -body { tcl::unsupported::getbytecode proc } -match glob -result {wrong # args: should be "* proc procName"} test compile-18.27 {disassembler - basics} -returnCodes error -body { tcl::unsupported::getbytecode proc nosuchproc } -result {"nosuchproc" isn't a procedure} test compile-18.28 {disassembler - basics} -setup { proc chewonthis {} {} } -body { dict keys [tcl::unsupported::getbytecode proc chewonthis] } -cleanup { rename chewonthis {} } -result $allbytecodekeys test compile-18.28.1 {disassembler - tricky bit} -setup { eval [list proc chewonthis {} {}] } -body { dict keys [tcl::unsupported::getbytecode proc chewonthis] } -cleanup { rename chewonthis {} } -result $bytecodekeys test compile-18.28.2 {disassembler - tricky bit} -setup { eval {proc chewonthis {} {}} } -body { dict keys [tcl::unsupported::getbytecode proc chewonthis] } -cleanup { rename chewonthis {} } -result $allbytecodekeys test compile-18.28.3 {disassembler - tricky bit} -setup { proc Proc {n a b} { proc $n $a $b } Proc chewonthis {} {} } -body { dict keys [tcl::unsupported::getbytecode proc chewonthis] |
︙ | ︙ | |||
886 887 888 889 890 891 892 | } Proc chewonthis {} {} } -body { dict keys [tcl::unsupported::getbytecode proc chewonthis] } -cleanup { rename Proc {} rename chewonthis {} | | | 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 | } Proc chewonthis {} {} } -body { dict keys [tcl::unsupported::getbytecode proc chewonthis] } -cleanup { rename Proc {} rename chewonthis {} } -result $allbytecodekeys test compile-18.29 {disassembler - basics} -returnCodes error -body { tcl::unsupported::getbytecode script } -match glob -result {wrong # args: should be "* script script"} test compile-18.30 {disassembler - basics} -body { dict keys [tcl::unsupported::getbytecode script {}] } -result $bytecodekeys test compile-18.31 {disassembler - basics} -returnCodes error -body { |
︙ | ︙ | |||
915 916 917 918 919 920 921 | } -result {unknown method "nosuchmethod"} test compile-18.35 {disassembler - basics} -setup { oo::class create foo {method bar {} {}} } -body { dict keys [tcl::unsupported::getbytecode method foo bar] } -cleanup { foo destroy | | | | 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 | } -result {unknown method "nosuchmethod"} test compile-18.35 {disassembler - basics} -setup { oo::class create foo {method bar {} {}} } -body { dict keys [tcl::unsupported::getbytecode method foo bar] } -cleanup { foo destroy } -result $allbytecodekeys test compile-18.36 {disassembler - basics} -returnCodes error -body { tcl::unsupported::getbytecode objmethod } -match glob -result {wrong # args: should be "* objmethod objectName methodName"} test compile-18.37 {disassembler - basics} -returnCodes error -body { tcl::unsupported::getbytecode objmethod nosuchobject foo } -result {nosuchobject does not refer to an object} test compile-18.38 {disassembler - basics} -returnCodes error -body { tcl::unsupported::getbytecode objmethod oo::object nosuchmethod } -result {unknown method "nosuchmethod"} test compile-18.39 {disassembler - basics} -setup { oo::object create foo oo::objdefine foo {method bar {} {}} } -body { dict keys [tcl::unsupported::getbytecode objmethod foo bar] } -cleanup { foo destroy } -result $allbytecodekeys test compile-18.40 {disassembler - basics} -returnCodes error -body { tcl::unsupported::disassemble constructor } -match glob -result {wrong # args: should be "* constructor className"} test compile-18.41 {disassembler - basics} -returnCodes error -body { tcl::unsupported::disassemble constructor nosuchclass } -result {nosuchclass does not refer to an object} test compile-18.42 {disassembler - basics} -returnCodes error -setup { |
︙ | ︙ | |||
980 981 982 983 984 985 986 | } -result {"constructorless" has no defined constructor} test compile-18.48 {disassembler - basics} -setup { oo::class create foo {constructor {} {set x 1}} } -body { dict keys [tcl::unsupported::getbytecode constructor foo] } -cleanup { foo destroy | | | 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 | } -result {"constructorless" has no defined constructor} test compile-18.48 {disassembler - basics} -setup { oo::class create foo {constructor {} {set x 1}} } -body { dict keys [tcl::unsupported::getbytecode constructor foo] } -cleanup { foo destroy } -result $allbytecodekeys # There is no compile-18.49 test compile-18.50 {disassembler - basics} -returnCodes error -body { tcl::unsupported::disassemble destructor } -match glob -result {wrong # args: should be "* destructor className"} test compile-18.51 {disassembler - basics} -returnCodes error -body { tcl::unsupported::disassemble destructor nosuchclass } -result {nosuchclass does not refer to an object} |
︙ | ︙ | |||
1029 1030 1031 1032 1033 1034 1035 | } -result {"constructorless" has no defined destructor} test compile-18.58 {disassembler - basics} -setup { oo::class create foo {destructor {set x 1}} } -body { dict keys [tcl::unsupported::getbytecode destructor foo] } -cleanup { foo destroy | | | 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 | } -result {"constructorless" has no defined destructor} test compile-18.58 {disassembler - basics} -setup { oo::class create foo {destructor {set x 1}} } -body { dict keys [tcl::unsupported::getbytecode destructor foo] } -cleanup { foo destroy } -result $allbytecodekeys test compile-19.0 {Bug 3614102: reset stack housekeeping} -body { # This will panic in a --enable-symbols=compile build, unless bug is fixed. apply {{} {list [if 1]}} } -returnCodes error -match glob -result * test compile-20.1 {ensure there are no infinite loops in optimizing} { |
︙ | ︙ |
Changes to tests/encoding.test.
︙ | ︙ | |||
462 463 464 465 466 467 468 469 470 471 472 473 474 475 | } \x00 test encoding-15.30 {UtfToUtfProc -profile strict CESU-8} { encoding convertto -profile strict cesu-8 \x00 } \x00 test encoding-15.31 {UtfToUtfProc -profile strict CESU-8 (bytes F0-F4 are invalid)} -body { encoding convertfrom -profile strict cesu-8 \xF1\x86\x83\x9C } -returnCodes 1 -result {unexpected byte sequence starting at index 0: '\xF1'} test encoding-16.1 {Utf16ToUtfProc} -body { set val [encoding convertfrom utf-16 NN] list $val [format %x [scan $val %c]] } -result "乎 4e4e" test encoding-16.2 {Utf16ToUtfProc} -body { set val [encoding convertfrom utf-16 "\xD8\xD8\xDC\xDC"] | > > > > > > | 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 | } \x00 test encoding-15.30 {UtfToUtfProc -profile strict CESU-8} { encoding convertto -profile strict cesu-8 \x00 } \x00 test encoding-15.31 {UtfToUtfProc -profile strict CESU-8 (bytes F0-F4 are invalid)} -body { encoding convertfrom -profile strict cesu-8 \xF1\x86\x83\x9C } -returnCodes 1 -result {unexpected byte sequence starting at index 0: '\xF1'} test encoding-15.32 {UtfToUtfProc CESU-8 [2f22a7364d]} -body { encoding convertto cesu-8 \U1f600 } -result \xED\xA0\xBD\xED\xB8\x80 test encoding-15.33 {UtfToUtfProc CESU-8 [63325009a8]} -body { encoding convertto cesu-8 \u0400 } -result \xD0\x80 test encoding-16.1 {Utf16ToUtfProc} -body { set val [encoding convertfrom utf-16 NN] list $val [format %x [scan $val %c]] } -result "乎 4e4e" test encoding-16.2 {Utf16ToUtfProc} -body { set val [encoding convertfrom utf-16 "\xD8\xD8\xDC\xDC"] |
︙ | ︙ | |||
1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 | encoding convertfrom -profile strict jis0208 \x78\x79 } -result {unexpected byte sequence starting at index 1: '\x79'} -returnCodes error test encoding-bug-66ffafd309-2-replace {Bug [66ffafd309] - invalid DBCS} -body { # Not truncated but invalid encoding convertfrom -profile replace jis0208 \x78\x79 } -result \uFFFD\uFFFD # cleanup namespace delete ::tcl::test::encoding ::tcltest::cleanupTests return # Local Variables: # mode: tcl # End: | > > > > > > > > > > | 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 | encoding convertfrom -profile strict jis0208 \x78\x79 } -result {unexpected byte sequence starting at index 1: '\x79'} -returnCodes error test encoding-bug-66ffafd309-2-replace {Bug [66ffafd309] - invalid DBCS} -body { # Not truncated but invalid encoding convertfrom -profile replace jis0208 \x78\x79 } -result \uFFFD\uFFFD test encoding-bug-201c7a3aa6-strict {Crash encoding non-BMP to iso2022} -body { encoding convertto -profile strict iso2022 \U1f600 } -result {unexpected character at index 0: 'U+01F600'} -returnCodes error test encoding-bug-201c7a3aa6-replace {Crash encoding non-BMP to iso2022} -body { encoding convertto -profile replace iso2022 \U1f600 } -result ? test encoding-bug-201c7a3aa6-tcl8 {Crash encoding non-BMP to iso2022} -body { encoding convertto -profile tcl8 iso2022 \U1f600 } -result ? # cleanup namespace delete ::tcl::test::encoding ::tcltest::cleanupTests return # Local Variables: # mode: tcl # End: |
Changes to tests/icu.test.
1 2 3 4 5 6 7 8 9 | # Tests for tcl::unsupported::icu if {"::tcltest" ni [namespace children]} { package require tcltest namespace import -force ::tcltest::* } # Force late loading of ICU if present catch {::tcl::unsupported::icu} | | > > | | < | < | | > > > > | < | > | > > > | < > | > | | > > < | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | # Tests for tcl::unsupported::icu if {"::tcltest" ni [namespace children]} { package require tcltest namespace import -force ::tcltest::* } # Force late loading of ICU if present catch {::tcl::unsupported::icu} testConstraint icu [llength [info commands ::tcl::unsupported::icu::detect]] namespace eval icu { namespace path {::tcl::unsupported ::tcl::mathop} test icu-detect-0 {Return list of ICU encodings} -constraints icu -body { set encoders [icu detect] list [in UTF-8 $encoders] [in ISO-8859-1 $encoders] } -result {1 1} test icu-detect-1 {Guess encoding} -constraints icu -body { icu detect [readFile [info script]] } -result ISO-8859-1 test icu-detect-2 {Get all possible encodings} -constraints icu -body { set encodings [icu detect [readFile [info script]] -all] list [in UTF-8 $encodings] [in ISO-8859-1 $encodings] } -result {1 1} test icu-detect-3 {error case} -constraints icu -returnCodes error -body { icu detect gorp gorp gorp } -result {wrong # args: should be "icu detect ?bytes ?-all??"} test icu-tclToIcu-0 {Map Tcl encoding} -constraints icu -body { # tis-620 because it is ambiguous in ICU on some platforms # but should return the preferred encoding lmap enc {utf-8 tis-620 shiftjis} { icu tclToIcu $enc } } -result {UTF-8 TIS-620 ibm-943_P15A-2003} test icu-tclToIcu-1 {Map Tcl encoding - no map} -constraints icu -body { # Should not raise an error icu tclToIcu dummy } -result {} test icu-tclToIcu-2 {error case} -constraints icu -returnCodes error -body { icu tclToIcu gorp gorp } -result {wrong # args: should be "icu tclToIcu tclName"} test icu-icuToTcl-0 {Map ICU encoding} -constraints icu -body { lmap enc {UTF-8 TIS-620 ibm-943_P15A-2003} { icu icuToTcl $enc } } -result {utf-8 tis-620 cp932} test icu-icuToTcl-1 {Map ICU encoding - no map} -constraints icu -body { # Should not raise an error icu icuToTcl dummy } -result {} test icu-icuToTcl-2 {error case} -constraints icu -returnCodes error -body { icu icuToTcl gorp gorp } -result {wrong # args: should be "icu icuToTcl icuName"} } namespace delete icu ::tcltest::cleanupTests |
Changes to tests/icuUcmTests.tcl.
1 2 3 4 | # This file is automatically generated by ucm2tests.tcl. # Edits will be overwritten on next generation. # | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 | # This file is automatically generated by ucm2tests.tcl. # Edits will be overwritten on next generation. # # Tests comparing Tcl encodings to ICU. # This file is NOT standalone. It should be sourced into a test script. proc ucmConvertfromMismatches {enc map} { set mismatches {} foreach {unihex hex} $map { set unihex [string range 00000000$unihex end-7 end]; # Make 8 digits set unich [subst "\\U$unihex"] if {[encoding convertfrom -profile strict $enc [binary decode hex $hex]] ne $unich} { |
︙ | ︙ |
Changes to tests/incr-old.test.
︙ | ︙ | |||
81 82 83 84 85 86 87 | test incr-old-2.9 {incr errors} { set x + list [catch {incr x 1} msg] $msg } {1 {expected integer but got "+"}} test incr-old-2.10 {incr errors} { set x {20 x} list [catch {incr x 1} msg] $msg | | | 81 82 83 84 85 86 87 88 89 90 91 92 | test incr-old-2.9 {incr errors} { set x + list [catch {incr x 1} msg] $msg } {1 {expected integer but got "+"}} test incr-old-2.10 {incr errors} { set x {20 x} list [catch {incr x 1} msg] $msg } {1 {expected integer but got a list}} # cleanup ::tcltest::cleanupTests return |
Changes to tests/incr.test.
︙ | ︙ | |||
67 68 69 70 71 72 73 | } {17 17} test incr-1.10 {TclCompileIncrCmd: no increment given} { set i 10 list [incr i] $i } {11 11} test incr-1.11 {TclCompileIncrCmd: simple global name} { proc p {} { | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 | } {17 17} test incr-1.10 {TclCompileIncrCmd: no increment given} { set i 10 list [incr i] $i } {11 11} test incr-1.11 {TclCompileIncrCmd: simple global name} { proc p {} { global i set i 54 incr i } p } {55} test incr-1.12 {TclCompileIncrCmd: simple local name} { proc p {} { set foo 100 incr foo } p } {101} test incr-1.13 {TclCompileIncrCmd: simple but new (unknown) local name} { proc p {} { incr bar } p } 1 test incr-1.14 {TclCompileIncrCmd: simple local name, >255 locals} { proc 260locals {} { # create 260 locals set a0 0; set a1 0; set a2 0; set a3 0; set a4 0 set a5 0; set a6 0; set a7 0; set a8 0; set a9 0 set b0 0; set b1 0; set b2 0; set b3 0; set b4 0 set b5 0; set b6 0; set b7 0; set b8 0; set b9 0 set c0 0; set c1 0; set c2 0; set c3 0; set c4 0 set c5 0; set c6 0; set c7 0; set c8 0; set c9 0 set d0 0; set d1 0; set d2 0; set d3 0; set d4 0 set d5 0; set d6 0; set d7 0; set d8 0; set d9 0 set e0 0; set e1 0; set e2 0; set e3 0; set e4 0 set e5 0; set e6 0; set e7 0; set e8 0; set e9 0 set f0 0; set f1 0; set f2 0; set f3 0; set f4 0 set f5 0; set f6 0; set f7 0; set f8 0; set f9 0 set g0 0; set g1 0; set g2 0; set g3 0; set g4 0 set g5 0; set g6 0; set g7 0; set g8 0; set g9 0 set h0 0; set h1 0; set h2 0; set h3 0; set h4 0 set h5 0; set h6 0; set h7 0; set h8 0; set h9 0 set i0 0; set i1 0; set i2 0; set i3 0; set i4 0 set i5 0; set i6 0; set i7 0; set i8 0; set i9 0 set j0 0; set j1 0; set j2 0; set j3 0; set j4 0 set j5 0; set j6 0; set j7 0; set j8 0; set j9 0 set k0 0; set k1 0; set k2 0; set k3 0; set k4 0 set k5 0; set k6 0; set k7 0; set k8 0; set k9 0 set l0 0; set l1 0; set l2 0; set l3 0; set l4 0 set l5 0; set l6 0; set l7 0; set l8 0; set l9 0 set m0 0; set m1 0; set m2 0; set m3 0; set m4 0 set m5 0; set m6 0; set m7 0; set m8 0; set m9 0 set n0 0; set n1 0; set n2 0; set n3 0; set n4 0 set n5 0; set n6 0; set n7 0; set n8 0; set n9 0 set o0 0; set o1 0; set o2 0; set o3 0; set o4 0 set o5 0; set o6 0; set o7 0; set o8 0; set o9 0 set p0 0; set p1 0; set p2 0; set p3 0; set p4 0 set p5 0; set p6 0; set p7 0; set p8 0; set p9 0 set q0 0; set q1 0; set q2 0; set q3 0; set q4 0 set q5 0; set q6 0; set q7 0; set q8 0; set q9 0 set r0 0; set r1 0; set r2 0; set r3 0; set r4 0 set r5 0; set r6 0; set r7 0; set r8 0; set r9 0 set s0 0; set s1 0; set s2 0; set s3 0; set s4 0 set s5 0; set s6 0; set s7 0; set s8 0; set s9 0 set t0 0; set t1 0; set t2 0; set t3 0; set t4 0 set t5 0; set t6 0; set t7 0; set t8 0; set t9 0 set u0 0; set u1 0; set u2 0; set u3 0; set u4 0 set u5 0; set u6 0; set u7 0; set u8 0; set u9 0 set v0 0; set v1 0; set v2 0; set v3 0; set v4 0 set v5 0; set v6 0; set v7 0; set v8 0; set v9 0 set w0 0; set w1 0; set w2 0; set w3 0; set w4 0 set w5 0; set w6 0; set w7 0; set w8 0; set w9 0 set x0 0; set x1 0; set x2 0; set x3 0; set x4 0 set x5 0; set x6 0; set x7 0; set x8 0; set x9 0 set y0 0; set y1 0; set y2 0; set y3 0; set y4 0 set y5 0; set y6 0; set y7 0; set y8 0; set y9 0 set z0 0; set z1 0; set z2 0; set z3 0; set z4 0 set z5 0; set z6 0; set z7 0; set z8 0; set z9 0 # now increment the last one (local var index > 255) incr z9 } 260locals } {1} test incr-1.15 {TclCompileIncrCmd: variable is array} -setup { unset -nocomplain a } -body { set a(foo) 27 |
︙ | ︙ | |||
231 232 233 234 235 236 237 238 239 240 241 242 243 244 | } -returnCodes error -result {expected integer but got " - "} test incr-1.30 {TclCompileIncrCmd: array var, braced (no subs)} -setup { catch {unset array} } -body { set array(\$foo) 4 incr {array($foo)} } -result 5 # Check "incr" and computed command names. unset -nocomplain x i test incr-2.0 {incr and computed command names} { set i 5 set z incr | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 | } -returnCodes error -result {expected integer but got " - "} test incr-1.30 {TclCompileIncrCmd: array var, braced (no subs)} -setup { catch {unset array} } -body { set array(\$foo) 4 incr {array($foo)} } -result 5 test incr-1.31 {no overflow in TclCompileIncrCmd and Tcl_IncrObjCmd, bug [7179c6724cd38271]} { set res [list] # TclCompileIncrCmd: compiled incr TEBC with immutable constant offs (INST_INCR_*_IMM instructions): lappend res [set i 0; incr i 0x7FFFFFFF] lappend res [set i 0; incr i 0xFFFFFF80] lappend res [set i 0; incr i 0xFFFFFF81] lappend res [set i 0; incr i 0xFFFFFFFF] lappend res [set i 0; incr i 0x10000007F] lappend res [set i 0; incr i 0x100000080] lappend res [set i 0; incr i 0x7FFFFFFFFFFFFFFF] lappend res [set i 0; incr i 0xFFFFFFFFFFFFFF80] lappend res [set i 0; incr i 0xFFFFFFFFFFFFFF81] lappend res [set i 0; incr i 0xFFFFFFFFFFFFFFFF] lappend res [set i 0; incr i 0x1000000000000007F] lappend res [set i 0; incr i 0x10000000000000080] # TclCompileIncrCmd: compiled incr TEBC with dynamic offs (INST_INCR_* instructions without _IMM): lappend res [set i 0; incr i [set x 0x7FFFFFFF]] lappend res [set i 0; incr i [set x 0xFFFFFF80]] lappend res [set i 0; incr i [set x 0xFFFFFF81]] lappend res [set i 0; incr i [set x 0xFFFFFFFF]] lappend res [set i 0; incr i [set x 0x10000007F]] lappend res [set i 0; incr i [set x 0x100000080]] lappend res [set i 0; incr i [set x 0x7FFFFFFFFFFFFFFF]] lappend res [set i 0; incr i [set x 0xFFFFFFFFFFFFFF80]] lappend res [set i 0; incr i [set x 0xFFFFFFFFFFFFFF81]] lappend res [set i 0; incr i [set x 0xFFFFFFFFFFFFFFFF]] lappend res [set i 0; incr i [set x 0x1000000000000007F]] lappend res [set i 0; incr i [set x 0x10000000000000080]] # Tcl_IncrObjCmd: non-compiled incr command (or NRE): set cmd incr lappend res [set i 0; $cmd i 0x7FFFFFFF] lappend res [set i 0; $cmd i 0xFFFFFF80] lappend res [set i 0; $cmd i 0xFFFFFF81] lappend res [set i 0; $cmd i 0xFFFFFFFF] lappend res [set i 0; $cmd i 0x10000007F] lappend res [set i 0; $cmd i 0x100000080] lappend res [set i 0; $cmd i 0x7FFFFFFFFFFFFFFF] lappend res [set i 0; $cmd i 0xFFFFFFFFFFFFFF80] lappend res [set i 0; $cmd i 0xFFFFFFFFFFFFFF81] lappend res [set i 0; $cmd i 0xFFFFFFFFFFFFFFFF] lappend res [set i 0; $cmd i 0x1000000000000007F] lappend res [set i 0; $cmd i 0x10000000000000080] } [lrepeat 3 \ [expr 0x7FFFFFFF] \ [expr 0xFFFFFF80] \ [expr 0xFFFFFF81] \ [expr 0xFFFFFFFF] \ [expr 0x10000007F] \ [expr 0x100000080] \ [expr 0x7FFFFFFFFFFFFFFF] \ [expr 0xFFFFFFFFFFFFFF80] \ [expr 0xFFFFFFFFFFFFFF81] \ [expr 0xFFFFFFFFFFFFFFFF] \ [expr 0x1000000000000007F] \ [expr 0x10000000000000080] \ ] # Check "incr" and computed command names. unset -nocomplain x i test incr-2.0 {incr and computed command names} { set i 5 set z incr |
︙ | ︙ | |||
299 300 301 302 303 304 305 | set z incr set i 10 list [$z i] $i } {11 11} test incr-2.11 {incr command (not compiled): simple global name} { proc p {} { set z incr | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 | set z incr set i 10 list [$z i] $i } {11 11} test incr-2.11 {incr command (not compiled): simple global name} { proc p {} { set z incr global i set i 54 $z i } p } {55} test incr-2.12 {incr command (not compiled): simple local name} { proc p {} { set z incr set foo 100 $z foo } p } {101} test incr-2.13 {incr command (not compiled): simple but new (unknown) local name} { proc p {} { set z incr $z bar } p } 1 test incr-2.14 {incr command (not compiled): simple local name, >255 locals} { proc 260locals {} { set z incr # create 260 locals set a0 0; set a1 0; set a2 0; set a3 0; set a4 0 set a5 0; set a6 0; set a7 0; set a8 0; set a9 0 set b0 0; set b1 0; set b2 0; set b3 0; set b4 0 set b5 0; set b6 0; set b7 0; set b8 0; set b9 0 set c0 0; set c1 0; set c2 0; set c3 0; set c4 0 set c5 0; set c6 0; set c7 0; set c8 0; set c9 0 set d0 0; set d1 0; set d2 0; set d3 0; set d4 0 set d5 0; set d6 0; set d7 0; set d8 0; set d9 0 set e0 0; set e1 0; set e2 0; set e3 0; set e4 0 set e5 0; set e6 0; set e7 0; set e8 0; set e9 0 set f0 0; set f1 0; set f2 0; set f3 0; set f4 0 set f5 0; set f6 0; set f7 0; set f8 0; set f9 0 set g0 0; set g1 0; set g2 0; set g3 0; set g4 0 set g5 0; set g6 0; set g7 0; set g8 0; set g9 0 set h0 0; set h1 0; set h2 0; set h3 0; set h4 0 set h5 0; set h6 0; set h7 0; set h8 0; set h9 0 set i0 0; set i1 0; set i2 0; set i3 0; set i4 0 set i5 0; set i6 0; set i7 0; set i8 0; set i9 0 set j0 0; set j1 0; set j2 0; set j3 0; set j4 0 set j5 0; set j6 0; set j7 0; set j8 0; set j9 0 set k0 0; set k1 0; set k2 0; set k3 0; set k4 0 set k5 0; set k6 0; set k7 0; set k8 0; set k9 0 set l0 0; set l1 0; set l2 0; set l3 0; set l4 0 set l5 0; set l6 0; set l7 0; set l8 0; set l9 0 set m0 0; set m1 0; set m2 0; set m3 0; set m4 0 set m5 0; set m6 0; set m7 0; set m8 0; set m9 0 set n0 0; set n1 0; set n2 0; set n3 0; set n4 0 set n5 0; set n6 0; set n7 0; set n8 0; set n9 0 set o0 0; set o1 0; set o2 0; set o3 0; set o4 0 set o5 0; set o6 0; set o7 0; set o8 0; set o9 0 set p0 0; set p1 0; set p2 0; set p3 0; set p4 0 set p5 0; set p6 0; set p7 0; set p8 0; set p9 0 set q0 0; set q1 0; set q2 0; set q3 0; set q4 0 set q5 0; set q6 0; set q7 0; set q8 0; set q9 0 set r0 0; set r1 0; set r2 0; set r3 0; set r4 0 set r5 0; set r6 0; set r7 0; set r8 0; set r9 0 set s0 0; set s1 0; set s2 0; set s3 0; set s4 0 set s5 0; set s6 0; set s7 0; set s8 0; set s9 0 set t0 0; set t1 0; set t2 0; set t3 0; set t4 0 set t5 0; set t6 0; set t7 0; set t8 0; set t9 0 set u0 0; set u1 0; set u2 0; set u3 0; set u4 0 set u5 0; set u6 0; set u7 0; set u8 0; set u9 0 set v0 0; set v1 0; set v2 0; set v3 0; set v4 0 set v5 0; set v6 0; set v7 0; set v8 0; set v9 0 set w0 0; set w1 0; set w2 0; set w3 0; set w4 0 set w5 0; set w6 0; set w7 0; set w8 0; set w9 0 set x0 0; set x1 0; set x2 0; set x3 0; set x4 0 set x5 0; set x6 0; set x7 0; set x8 0; set x9 0 set y0 0; set y1 0; set y2 0; set y3 0; set y4 0 set y5 0; set y6 0; set y7 0; set y8 0; set y9 0 set z0 0; set z1 0; set z2 0; set z3 0; set z4 0 set z5 0; set z6 0; set z7 0; set z8 0; set z9 0 # now increment the last one (local var index > 255) $z z9 } 260locals } {1} test incr-2.15 {incr command (not compiled): variable is array} -setup { unset -nocomplain a } -body { set z incr |
︙ | ︙ |
Changes to tests/info.test.
︙ | ︙ | |||
394 395 396 397 398 399 400 | unset tcl_library info library } -returnCodes error -result {no library has been specified for Tcl} set tcl_library $savedLibrary; unset savedLibrary test info-11.1 {info loaded option} -body { info loaded a b c | | | 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 | unset tcl_library info library } -returnCodes error -result {no library has been specified for Tcl} set tcl_library $savedLibrary; unset savedLibrary test info-11.1 {info loaded option} -body { info loaded a b c } -returnCodes error -result {wrong # args: should be "info loaded ?interp? ?prefix?"} test info-11.2 {info loaded option} -body { info loaded {}; info loaded gorp } -returnCodes error -result {could not find interpreter "gorp"} test info-12.1 {info locals option} -body { set a 22 proc t1 {x y} { |
︙ | ︙ | |||
2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 | test info-33.35 {{*}, literal, simple, bytecompiled} -body { reduce [foo::bar] } -cleanup { namespace delete foo } -result {type source line 2389 file info.test cmd {info frame 0} proc ::foo::bar level 0} # ------------------------------------------------------------------------- namespace eval ::testinfocmdtype { apply {cmds { foreach c $cmds {rename $c {}} } ::testinfocmdtype} [info commands ::testinfocmdtype::*] } test info-40.1 {info cmdtype: syntax} -body { info cmdtype | > | 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 | test info-33.35 {{*}, literal, simple, bytecompiled} -body { reduce [foo::bar] } -cleanup { namespace delete foo } -result {type source line 2389 file info.test cmd {info frame 0} proc ::foo::bar level 0} # ------------------------------------------------------------------------- namespace eval ::testinfocmdtype { apply {cmds { foreach c $cmds {rename $c {}} } ::testinfocmdtype} [info commands ::testinfocmdtype::*] } test info-40.1 {info cmdtype: syntax} -body { info cmdtype |
︙ | ︙ | |||
2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 | } -returnCodes error -cleanup { interp delete $safe } -result {not allowed to invoke subcommand cmdtype of info} namespace delete ::testinfocmdtype # ------------------------------------------------------------------------- unset -nocomplain res test info-39.2 {Bug 4b61afd660} -setup { proc probe {} { return [dict get [info frame -1] line] } set body { set cmd probe $cmd } proc demo {} $body } -body { demo } -cleanup { unset -nocomplain body rename demo {} rename probe {} } -result 3 | > > > > > > > > > > > > > > > > > > > > > > | < < < < < < < < < > > > > > > > > > | 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 | } -returnCodes error -cleanup { interp delete $safe } -result {not allowed to invoke subcommand cmdtype of info} namespace delete ::testinfocmdtype # ------------------------------------------------------------------------- unset -nocomplain res test info-19.7 {info vars: bug [0e4b7fce57], TIP #278 - no global vars resolve} -setup { catch {namespace delete x} } -body { namespace eval x {info vars} } -cleanup { namespace delete x } -result {} test info-19.8 {info vars: bug [0e4b7fce57], TIP #278 - no global vars resolve} -setup { catch {namespace delete x} } -body { namespace eval x {info vars tcl_platform} } -cleanup { namespace delete x } -result {} test info-19.9 {info vars: global vars resolved by pattern} -setup { catch {namespace delete x} } -body { namespace eval x {info vars ::tcl_platform} } -cleanup { namespace delete x } -result {::tcl_platform} test info-39.2 {Bug 4b61afd660} -setup { proc probe {} { return [dict get [info frame -1] line] } set body { set cmd probe $cmd } proc demo {} $body } -body { demo } -cleanup { unset -nocomplain body rename demo {} rename probe {} } -result 3 test info-41.0 {Bug 0de6c1d79c crash} -setup { interp create child child hide info } -body { list [child invokehidden info frame] \ [child invokehidden info frame 0] \ [child invokehidden info frame 1] \ [catch {child invokehidden info frame -1} msg] $msg \ [catch {child invokehidden info frame 2} msg] $msg } -cleanup { interp delete child unset -nocomplain msg } -result {1 {type precompiled} {type precompiled} 1 {bad level "-1"} 1 {bad level "2"}} test info-41.1 {Bug 0de6c1d79c crash} -setup { interp create child child hide info } -cleanup { interp delete child } -body { child invokehidden info frame } -result 1 # cleanup catch {namespace delete test_ns_info1 test_ns_info2} ::tcltest::cleanupTests return |
Changes to tests/interp.test.
︙ | ︙ | |||
16 17 18 19 20 21 22 | } ::tcltest::loadTestedCommands catch [list package require -exact tcl::test [info patchlevel]] testConstraint testinterpdelete [llength [info commands testinterpdelete]] | | | 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | } ::tcltest::loadTestedCommands catch [list package require -exact tcl::test [info patchlevel]] testConstraint testinterpdelete [llength [info commands testinterpdelete]] set hidden_cmds {cd encoding exec exit fconfigure file glob load open pwd socket source tcl:encoding:dirs tcl:encoding:system tcl:file:atime tcl:file:attributes tcl:file:copy tcl:file:delete tcl:file:dirname tcl:file:executable tcl:file:exists tcl:file:extension tcl:file:home tcl:file:isdirectory tcl:file:isfile tcl:file:link tcl:file:lstat tcl:file:mkdir tcl:file:mtime tcl:file:nativename tcl:file:normalize tcl:file:owned tcl:file:readable tcl:file:readlink tcl:file:rename tcl:file:rootname tcl:file:size tcl:file:stat tcl:file:tail tcl:file:tempdir tcl:file:tempfile tcl:file:tildeexpand tcl:file:type tcl:file:volumes tcl:file:writable tcl:info:cmdtype tcl:info:nameofexecutable tcl:process:autopurge tcl:process:list tcl:process:purge tcl:process:status tcl:zipfs:canonical tcl:zipfs:exists tcl:zipfs:info tcl:zipfs:list tcl:zipfs:lmkimg tcl:zipfs:lmkzip tcl:zipfs:mkimg tcl:zipfs:mkkey tcl:zipfs:mkzip tcl:zipfs:mount tcl:zipfs:mountdata tcl:zipfs:root tcl:zipfs:unmount unload zipfs} proc _ms_limit_args {ms {t0 {}}} { if {$t0 eq {}} { set t0 [clock milliseconds] } incr t0 $ms list -seconds [expr {$t0 / 1000}] -milliseconds [expr {$t0 % 1000}] } |
︙ | ︙ |
Changes to tests/list.test.
︙ | ︙ | |||
60 61 62 63 64 65 66 67 68 69 70 71 72 73 | string equal $srep $lrep } 1 test list-1.30 {basic null treatment} { set l [list "\x00abc" "xyz"] set e "\x00abc xyz" string equal $l $e } 1 # For the next round of tests create a list and then pick it apart # with "index" to make sure that we get back exactly what went in. set num 0 proc lcheck {testid a b c} { global num d | > > > > > > > > > > | 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | string equal $srep $lrep } 1 test list-1.30 {basic null treatment} { set l [list "\x00abc" "xyz"] set e "\x00abc xyz" string equal $l $e } 1 test list-1.31 {bug [e38dce74e2]} { set l #foo set e {} list {*}$l {*}$e } {{#foo}} test list-1.32 {bug [e38dce74e2]} { set l " #foo" set e {} list {*}$l {*}$e } {{#foo}} # For the next round of tests create a list and then pick it apart # with "index" to make sure that we get back exactly what went in. set num 0 proc lcheck {testid a b c} { global num d |
︙ | ︙ |
Changes to tests/load.test.
︙ | ︙ | |||
64 65 66 67 68 69 70 | load {} Unknown } -result {no library with prefix "Unknown" is loaded statically} test load-1.7 {basic errors} -returnCodes error -body { load -abc foo } -result {bad option "-abc": must be -global, -lazy, or --} test load-1.8 {basic errors} -returnCodes error -body { load -global | | | 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | load {} Unknown } -result {no library with prefix "Unknown" is loaded statically} test load-1.7 {basic errors} -returnCodes error -body { load -abc foo } -result {bad option "-abc": must be -global, -lazy, or --} test load-1.8 {basic errors} -returnCodes error -body { load -global } -result {cannot figure out prefix for -global} test load-2.1 {basic loading, with guess for package name} \ [list $dll $loaded] { load -global [file join $testDir tcl9pkga$ext] list [pkga_eq abc def] [lsort [info commands pkga_*]] } {0 {pkga_eq pkga_quote}} interp create -safe child |
︙ | ︙ | |||
86 87 88 89 90 91 92 | -body { list [catch {load [file join $testDir tcl9pkgc$ext] Foo} msg] $msg $errorCode } -match glob \ -result [list 1 {cannot find symbol "Foo_Init"*} \ {TCL LOOKUP LOAD_SYMBOL *Foo_Init}] test load-2.4 {loading with no _SafeInit procedure} [list $dll $loaded] { list [catch {load [file join $testDir tcl9pkga$ext] {} child} msg] $msg | | | 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | -body { list [catch {load [file join $testDir tcl9pkgc$ext] Foo} msg] $msg $errorCode } -match glob \ -result [list 1 {cannot find symbol "Foo_Init"*} \ {TCL LOOKUP LOAD_SYMBOL *Foo_Init}] test load-2.4 {loading with no _SafeInit procedure} [list $dll $loaded] { list [catch {load [file join $testDir tcl9pkga$ext] {} child} msg] $msg } {1 {cannot use library in a safe interpreter: no Pkga_SafeInit procedure}} test load-3.1 {error in _Init procedure, same interpreter} \ [list $dll $loaded] { list [catch {load [file join $testDir tcl9pkge$ext] Pkge} msg] \ $msg $::errorInfo $::errorCode } {1 {couldn't open "non_existent": no such file or directory} {couldn't open "non_existent": no such file or directory while executing |
︙ | ︙ | |||
160 161 162 163 164 165 166 | test load-7.2 {Tcl_StaticLibrary procedure} [list teststaticlibrary] { set x "not loaded" teststaticlibrary Another 0 0 load {} Another child eval {set x "not loaded"} list [catch {load {} Another child} msg] $msg \ [child eval set x] [set x] | | | 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 | test load-7.2 {Tcl_StaticLibrary procedure} [list teststaticlibrary] { set x "not loaded" teststaticlibrary Another 0 0 load {} Another child eval {set x "not loaded"} list [catch {load {} Another child} msg] $msg \ [child eval set x] [set x] } {1 {cannot use library in a safe interpreter: no Another_SafeInit procedure} {not loaded} loaded} test load-7.3 {Tcl_StaticLibrary procedure} [list teststaticlibrary] { set x "not loaded" teststaticlibrary More 0 1 load {} More set x } {not loaded} catch {load [file join $testDir tcl9pkga$ext] Pkga} |
︙ | ︙ |
Changes to tests/lsearch.test.
︙ | ︙ | |||
43 44 45 46 47 48 49 | lsearch -exact {foo bar cat} bart } -1 test lsearch-2.5 {search modes} { lsearch -exact {foo bar cat} bar } 1 test lsearch-2.6 {search modes} -returnCodes error -body { lsearch -regexp {xyz bbcc *bc*} *bc* | | | 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | lsearch -exact {foo bar cat} bart } -1 test lsearch-2.5 {search modes} { lsearch -exact {foo bar cat} bar } 1 test lsearch-2.6 {search modes} -returnCodes error -body { lsearch -regexp {xyz bbcc *bc*} *bc* } -result {cannot compile regular expression pattern: invalid quantifier operand} test lsearch-2.7 {search modes} { lsearch -regexp {b.x ^bc xy bcx} ^bc } 3 test lsearch-2.8 {search modes} { lsearch -glob {xyz bbcc *bc*} *bc* } 1 test lsearch-2.9 {search modes} { |
︙ | ︙ |
Changes to tests/lseq.test.
︙ | ︙ | |||
140 141 142 143 144 145 146 | lseq 66 84 by 3 } {66 69 72 75 78 81 84} test lseq-1.22 {n n by -n} { lseq 84 66 by -3 } {84 81 78 75 72 69 66} | | > | | 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 | lseq 66 84 by 3 } {66 69 72 75 78 81 84} test lseq-1.22 {n n by -n} { lseq 84 66 by -3 } {84 81 78 75 72 69 66} test lseq-1.23 {consistence, accept double count representable as integer (but use double in series when arguments other than count value are of type double)} { list [lseq 0.0 2.0] [lseq 3.0] [lseq 0 count 3.0] \ [lseq 0.0 count 3.0] [lseq 0 count 3.0 by 1.0] } {{0.0 1.0 2.0} {0 1 2} {0 1 2} {0.0 1.0 2.0} {0.0 1.0 2.0}} test lseq-1.24 {consistence, use double (even if representable as integer) in all variants, if contains a double somewhere} { list [lseq 0.0 2] [lseq 0 2.0] [lseq 0.0 count 3] \ [lseq 0 count 3 by 1.0] [lseq 0 .. 2.0] [lseq 0 to 2 by 1.0] } [lrepeat 6 {0.0 1.0 2.0}] test lseq-1.25 {consistence, use double (even if representable as integer) in all variants, if contains a double somewhere} { list [lseq double(0) 2] [lseq 0 double(2)] [lseq double(0) count 3] \ [lseq 0 count 3 by double(1)] [lseq 0 .. double(2)] [lseq 0 to 2 by double(1)] |
︙ | ︙ | |||
261 262 263 264 265 266 267 | [lseq {1+1} {5+5} {2+2}] \ [lseq {1+1} count {2+2} by {2+2}] } {{0 1} {2 3 4} {2 3 4 5} {2 6 10} {2 6 10 14}} test lseq-2.20 {expressions as indices, no duplicative eval of expr} { set i 1 list [lseq {[incr i]}] $i [lseq {0 + [incr i]}] $i [lseq {0.0 + [incr i]}] $i | | | 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 | [lseq {1+1} {5+5} {2+2}] \ [lseq {1+1} count {2+2} by {2+2}] } {{0 1} {2 3 4} {2 3 4 5} {2 6 10} {2 6 10 14}} test lseq-2.20 {expressions as indices, no duplicative eval of expr} { set i 1 list [lseq {[incr i]}] $i [lseq {0 + [incr i]}] $i [lseq {0.0 + [incr i]}] $i } {{0 1} 2 {0 1 2} 3 {0 1 2 3} 4} test lseq-3.0 {expr error: don't swalow expr error (here: divide by zero)} -body { set i 0; lseq {3/$i} } -returnCodes [catch {expr {3/0}} res] -result $res test lseq-3.1 {experiement} -body { set ans {} |
︙ | ︙ | |||
847 848 849 850 851 852 853 | lappend ll [llength [lseq 0 count 200 by .1]] lappend ll [llength [lseq 0 count 100 by .01]] lappend ll [llength [lseq 0 count 200 by .01]] lappend ll [llength [lseq 0 count 100 by .011]] lappend ll [llength [lseq 0 count 200 by .011]] } -result {100 200 100 200 100 200} | > > > > > > > > > > > > | | 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 | lappend ll [llength [lseq 0 count 200 by .1]] lappend ll [llength [lseq 0 count 100 by .01]] lappend ll [llength [lseq 0 count 200 by .01]] lappend ll [llength [lseq 0 count 100 by .011]] lappend ll [llength [lseq 0 count 200 by .011]] } -result {100 200 100 200 100 200} test lseq-bug-f4a4bd7f1070-1 {} -body { set result {} lappend result [catch {lseq 3.1} msg] lappend result $msg lappend result [catch {lseq 5 count 3.0} msg] lappend result $msg lappend result [lseq 3] lappend result [lseq 3.0] lappend result [lseq 5.1e1] lappend result [string compare [lseq 3] [lseq 3.0]] set result } -result {1 {expected integer but got "3.1"} 0 {5 6 7} {0 1 2} {0 1 2} {0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50} 0} # cleanup ::tcltest::cleanupTests return # Local Variables: # mode: tcl # End: |
Changes to tests/msgcat.test.
︙ | ︙ | |||
1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 | namespace eval bar {::msgcat::mcforgetpackage} namespace eval baz {::msgcat::mcforgetpackage} namespace delete bar baz } -body { bar::ObjCur method1 } -result con2baz # Test msgcat-16.*: command mcpackagenamespaceget test msgcat-16.1 {mcpackagenamespaceget in namespace procedure} -body { namespace eval baz {msgcat::mcpackagenamespaceget} } -result ::msgcat::test::baz test msgcat-16.2 {mcpackagenamespaceget in class setup} -setup { | > > > > > > > > > > > > > > > > > > > > > > > > | 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 | namespace eval bar {::msgcat::mcforgetpackage} namespace eval baz {::msgcat::mcforgetpackage} namespace delete bar baz } -body { bar::ObjCur method1 } -result con2baz # HaO 2024-07-15 fix me # Ticket 91b3a5bb: I have no idea what the following case should do. # But currently, it raises an error and that should not happen. # The background is the tklib tooltip package. # This package captures the caller namespace to later invoke msgcat with current data. # If the caller namespace is a method, it currently fails. test msgcat-15.5 {ticket 91b3a5bb: method namespace recorded and evaluated gives error}\ -setup { oo::class create App {} oo::define App { constructor {} { my add_one } method add_one {} { recordMsgcat } } proc ::recordMsgcat {} { set ::nscaller [uplevel 1 {namespace current}] } set application [App new] } -cleanup { $application destroy App destroy unset -nocomplain ::nscaller rename ::recordMsgcat "" } -body { namespace eval $::nscaller [list ::msgcat::mc "Test"] } -returnCodes ok -result Test # Test msgcat-16.*: command mcpackagenamespaceget test msgcat-16.1 {mcpackagenamespaceget in namespace procedure} -body { namespace eval baz {msgcat::mcpackagenamespaceget} } -result ::msgcat::test::baz test msgcat-16.2 {mcpackagenamespaceget in class setup} -setup { |
︙ | ︙ |
Changes to tests/oo.test.
︙ | ︙ | |||
1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 | # No segmentation fault return done } -result done -cleanup { rename obj1 {} } test oo-12.1 {OO: filters} { oo::class create Aclass Aclass create Aobject oo::define Aclass { method concatenate args { global result lappend result {*}$args | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 | # No segmentation fault return done } -result done -cleanup { rename obj1 {} } test oo-11.7 {Bug 154f0982f2: createWithNamespace and an existing namespace} -setup { oo::class create Aclass { self export createWithNamespace method ns {} {namespace current} } } -body { namespace eval test_oo117 {variable name [namespace current]} list [Aclass createWithNamespace aInstance $test_oo117::name] [aInstance ns] } -returnCodes error -cleanup { Aclass destroy catch {namespace delete test_oo117} } -result {can't create namespace "::test_oo117": already exists} test oo-11.8 {Bug 708422: unset traces in deletion shouldn't crash} -setup { oo::class create foo { self export createWithNamespace method dummy {} {} } set result {} } -body { oo::define foo { variable x constructor {} { trace add variable x unset [list apply {{self ns args} { global result lappend result [info object isa object $self] lappend result [namespace exists $ns] # Method dispatch fails; too much gone in this case catch {$self dummy} msg lappend result $msg }} [self] [self namespace]] } } [foo createWithNamespace bar oo-11.8] destroy return $result } -cleanup { foo destroy } -result {1 0 {impossible to invoke method "dummy": no defined method or unknown method}} test oo-12.1 {OO: filters} { oo::class create Aclass Aclass create Aobject oo::define Aclass { method concatenate args { global result lappend result {*}$args |
︙ | ︙ | |||
3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 | parent destroy } -result {this command cannot be called when the object has been deleted while executing "self {error foobar}" (in definition script for class "::foo" line 1) invoked from within "oo::define foo {rename ::foo {}; self {error foobar}}"} test oo-19.1 {OO: varname method} -setup { oo::object create inst oo::objdefine inst export eval set result {} inst eval { variable x } } -body { | > > > > > > > > > > | 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 | parent destroy } -result {this command cannot be called when the object has been deleted while executing "self {error foobar}" (in definition script for class "::foo" line 1) invoked from within "oo::define foo {rename ::foo {}; self {error foobar}}"} test oo-18.12 {OO: self callable via eval method} -setup { oo::class create parent { export eval } parent create ::foo } -body { foo eval { self } } -cleanup { parent destroy } -result ::foo test oo-19.1 {OO: varname method} -setup { oo::object create inst oo::objdefine inst export eval set result {} inst eval { variable x } } -body { |
︙ | ︙ | |||
3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 | } -body { testClass create A testClass create B lsearch [list [A varname foo] [B varname foo]] [B bar A] } -cleanup { testClass destroy } -result 0 test oo-20.1 {OO: variable method} -body { oo::class create testClass { constructor {} { my variable ok set ok {} } | > > > > > > > > > > > > > > > > > > > > > > > > > > | 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 | } -body { testClass create A testClass create B lsearch [list [A varname foo] [B varname foo]] [B bar A] } -cleanup { testClass destroy } -result 0 test oo-19.4 {OO: varname ghosts [Bug 74b6110204]} -setup { oo::class create testClass { export varname self export createWithNamespace } set obj [testClass createWithNamespace testoo19_4 testoo19_4] set ns [info object namespace $obj] } -body { set v [$obj varname foo] list [namespace which -variable $v] \ [info exists $v] [namespace which -variable $v] } -cleanup { testClass destroy } -result {::testoo19_4::foo 0 ::testoo19_4::foo} test oo-19.5 {OO: varname array elements [Bug 2da1cb0c80]} -setup { set obj [oo::object new] oo::objdefine $obj export eval varname } -body { $obj eval { namespace upvar :: tcl_platform(platform) foo } $obj varname foo } -cleanup { $obj destroy } -result ::tcl_platform(platform) # Test oo-19.5.1 is no longer relevant test oo-20.1 {OO: variable method} -body { oo::class create testClass { constructor {} { my variable ok set ok {} } |
︙ | ︙ | |||
3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 | A run 2 } -cleanup { catch {rename dump {}} catch {A destroy} catch {B destroy} } -match glob -result {{* method Work class ::A *} {* method Work class ::A *}} WorkerBase destroy # Prove that the issue in [Bug 1865054] isn't an issue any more test oo-23.1 {Self-like derivation; complex case!} -setup { oo::class create SELF { superclass oo::class unexport create new # Next is just a convenience | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 | A run 2 } -cleanup { catch {rename dump {}} catch {A destroy} catch {B destroy} } -match glob -result {{* method Work class ::A *} {* method Work class ::A *}} WorkerBase destroy test oo-22.7 {oo::define and info frame: correct argument line} -setup { oo::class create C { variable base constructor {info} {set base [dict get $info line]} method Relative {} { set info [next] if {![dict exists $info file]} { error "no file-relative line info: $info" } expr {[dict get $info line] - $base} } filter Relative } } -body { C create o [info frame 0] oo::define C { method line1 {} {info frame 0} method line2 { } {info frame 0} method line3 { } { info frame 0 } } oo::define C method line4 {} {info frame 0} oo::define C method line5 { } {info frame 0} oo::define C method line6 { } { info frame 0 } list [o line1] [o line2] [o line3] [o line4] [o line5] [o line6] } -cleanup { C destroy } -result {2 4 7 10 12 15} test oo-22.8 {oo::objdefine and info frame: correct argument line} -setup { oo::class create C { variable base constructor {info} {set base [dict get $info line]} method Relative {} { set info [next] if {![dict exists $info file]} { error "no file-relative line info: $info" } expr {[dict get $info line] - $base} } filter Relative } } -body { C create o [info frame 0] oo::objdefine o { method line1 {} {info frame 0} method line2 { } {info frame 0} method line3 { } { info frame 0 } } oo::objdefine o method line4 {} {info frame 0} oo::objdefine o method line5 { } {info frame 0} oo::objdefine o method line6 { } { info frame 0 } list [o line1] [o line2] [o line3] [o line4] [o line5] [o line6] } -cleanup { C destroy } -result {2 4 7 10 12 15} # Prove that the issue in [Bug 1865054] isn't an issue any more test oo-23.1 {Self-like derivation; complex case!} -setup { oo::class create SELF { superclass oo::class unexport create new # Next is just a convenience |
︙ | ︙ |
Changes to tests/ooUtil.test.
︙ | ︙ | |||
173 174 175 176 177 178 179 180 181 182 183 184 185 186 | } # This is confirming that this is a (basic) safe interpreter list [Table find foo bar] [info commands source] } } -cleanup { interp delete $safeinterp } -result {{::Table called with arguments: foo bar} {}} test ooUtil-2.1 {TIP 478: callback generation} -setup { oo::class create parent } -body { oo::class create c { superclass parent method CallMe {} { return ok,[self] } | > > > > > > > > > > > > | 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 | } # This is confirming that this is a (basic) safe interpreter list [Table find foo bar] [info commands source] } } -cleanup { interp delete $safeinterp } -result {{::Table called with arguments: foo bar} {}} test ooUtil-1.10.1 {Bug 680503: classmethod shouldn't require create body} -body { oo::class create C oo::define C {classmethod cm {} {}} } -cleanup { catch {C destroy} } -result {} test ooUtil-1.10.2 {Bug 680503: case that worked} -body { oo::class create C {} oo::define C {classmethod cm {} {}} } -cleanup { catch {C destroy} } -result {} test ooUtil-2.1 {TIP 478: callback generation} -setup { oo::class create parent } -body { oo::class create c { superclass parent method CallMe {} { return ok,[self] } |
︙ | ︙ |
Changes to tests/reg.test.
︙ | ︙ | |||
335 336 337 338 339 340 341 | ######## the tests themselves ######## # support functions and preliminary misc. # This is sensitive to changes in message wording, but we really have to # test the code->message expansion at least once. ::tcltest::test reg-0.1 "regexp error reporting" { list [catch {regexp (*) ign} msg] $msg | | | 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 | ######## the tests themselves ######## # support functions and preliminary misc. # This is sensitive to changes in message wording, but we really have to # test the code->message expansion at least once. ::tcltest::test reg-0.1 "regexp error reporting" { list [catch {regexp (*) ign} msg] $msg } {1 {cannot compile regular expression pattern: invalid quantifier operand}} doing 1 "basic sanity checks" expectMatch 1.1 & abc abc abc expectNomatch 1.2 & abc def expectMatch 1.3 & abc xyabxabce abc |
︙ | ︙ |
Changes to tests/regexp.test.
︙ | ︙ | |||
271 272 273 274 275 276 277 | list [catch {regexp -nocase a} msg] $msg } {1 {wrong # args: should be "regexp ?-option ...? exp string ?matchVar? ?subMatchVar ...?"}} test regexp-6.3 {regexp errors} { list [catch {regexp -gorp a} msg] $msg } {1 {bad option "-gorp": must be -all, -about, -indices, -inline, -expanded, -line, -linestop, -lineanchor, -nocase, -start, or --}} test regexp-6.4 {regexp errors} { list [catch {regexp a( b} msg] $msg | | | | | 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 | list [catch {regexp -nocase a} msg] $msg } {1 {wrong # args: should be "regexp ?-option ...? exp string ?matchVar? ?subMatchVar ...?"}} test regexp-6.3 {regexp errors} { list [catch {regexp -gorp a} msg] $msg } {1 {bad option "-gorp": must be -all, -about, -indices, -inline, -expanded, -line, -linestop, -lineanchor, -nocase, -start, or --}} test regexp-6.4 {regexp errors} { list [catch {regexp a( b} msg] $msg } {1 {cannot compile regular expression pattern: parentheses () not balanced}} test regexp-6.5 {regexp errors} { list [catch {regexp a( b} msg] $msg } {1 {cannot compile regular expression pattern: parentheses () not balanced}} test regexp-6.6 {regexp errors} { list [catch {regexp a a f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1} msg] $msg } {0 1} test regexp-6.7 {regexp errors} { list [catch {regexp (x)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.) xyzzy} msg] $msg } {0 0} test regexp-6.8 {regexp errors} -setup { unset -nocomplain f1 } -body { set f1 44 regexp abc abc f1(f2) } -returnCodes error -result {can't set "f1(f2)": variable isn't array} test regexp-6.9 {regexp errors, -start bad int check} { list [catch {regexp -start bogus {^$} {}} msg] $msg } {1 {bad index "bogus": must be integer?[+-]integer? or end?[+-]integer?}} test regexp-6.10 {regexp errors} { list [catch {regexp {a[} b} msg] $msg } {1 {cannot compile regular expression pattern: brackets [] not balanced}} test regexp-7.1 {basic regsub operation} { list [regsub aa+ xaxaaaxaa 111&222 foo] $foo } {1 xax111aaa222xaa} test regexp-7.2 {basic regsub operation} { list [regsub aa+ aaaxaa &111 foo] $foo } {1 aaa111xaa} |
︙ | ︙ | |||
477 478 479 480 481 482 483 | list [catch {regsub a b c d e f} msg] $msg } {1 {wrong # args: should be "regsub ?-option ...? exp string subSpec ?varName?"}} test regexp-11.5 {regsub errors} { list [catch {regsub -gorp a b c} msg] $msg } {1 {bad option "-gorp": must be -all, -command, -expanded, -line, -linestop, -lineanchor, -nocase, -start, or --}} test regexp-11.6 {regsub errors} { list [catch {regsub -nocase a( b c d} msg] $msg | | | 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 | list [catch {regsub a b c d e f} msg] $msg } {1 {wrong # args: should be "regsub ?-option ...? exp string subSpec ?varName?"}} test regexp-11.5 {regsub errors} { list [catch {regsub -gorp a b c} msg] $msg } {1 {bad option "-gorp": must be -all, -command, -expanded, -line, -linestop, -lineanchor, -nocase, -start, or --}} test regexp-11.6 {regsub errors} { list [catch {regsub -nocase a( b c d} msg] $msg } {1 {cannot compile regular expression pattern: parentheses () not balanced}} test regexp-11.7 {regsub errors} -setup { unset -nocomplain f1 } -body { set f1 44 regsub -nocase aaa aaa xxx f1(f2) } -returnCodes error -result {can't set "f1(f2)": variable isn't array} test regexp-11.8 {regsub errors, -start bad int check} { |
︙ | ︙ | |||
885 886 887 888 889 890 891 | [a 667]([a 55])[a 668]([a 55])[a 669]([a 55])[a 668]([a 55]) \ [a 671]([a 55])[a 669]([a 55])[a 668]([a 55])[a 669]([a 55]) \ [a 669]([a 55])[a 669]([a 55])[a 668]([a 55])[a 669]([a 55]) \ [a 668]([a 55])[a 710]([a 55])[a 668]([a 55])[a 668]([a 55]) \ [a 668]([a 55])[a 668]([a 55])[a 668]([a 55])[a 511]] {}] a } -cleanup { rename a {} | | | 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 | [a 667]([a 55])[a 668]([a 55])[a 669]([a 55])[a 668]([a 55]) \ [a 671]([a 55])[a 669]([a 55])[a 668]([a 55])[a 669]([a 55]) \ [a 669]([a 55])[a 669]([a 55])[a 668]([a 55])[a 669]([a 55]) \ [a 668]([a 55])[a 710]([a 55])[a 668]([a 55])[a 668]([a 55]) \ [a 668]([a 55])[a 668]([a 55])[a 668]([a 55])[a 511]] {}] a } -cleanup { rename a {} } -returnCodes 1 -match glob -result {cannot compile regular expression pattern: *} test regexp-22.5 {Bug 3610026} -setup { set e {} set cp 99 while {$cp < 32864} { append e [format %c [incr cp]] } } -body { |
︙ | ︙ |
Changes to tests/regexpComp.test.
︙ | ︙ | |||
327 328 329 330 331 332 333 | list [catch {regexp -gorp a} msg] $msg } } {1 {bad option "-gorp": must be -all, -about, -indices, -inline, -expanded, -line, -linestop, -lineanchor, -nocase, -start, or --}} test regexpComp-6.4 {regexp errors} { evalInProc { list [catch {regexp a( b} msg] $msg } | | | | 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 | list [catch {regexp -gorp a} msg] $msg } } {1 {bad option "-gorp": must be -all, -about, -indices, -inline, -expanded, -line, -linestop, -lineanchor, -nocase, -start, or --}} test regexpComp-6.4 {regexp errors} { evalInProc { list [catch {regexp a( b} msg] $msg } } {1 {cannot compile regular expression pattern: parentheses () not balanced}} test regexpComp-6.5 {regexp errors} { evalInProc { list [catch {regexp a( b} msg] $msg } } {1 {cannot compile regular expression pattern: parentheses () not balanced}} test regexpComp-6.6 {regexp errors} { evalInProc { list [catch {regexp a a f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1 f1} msg] $msg } } {0 1} test regexpComp-6.7 {regexp errors} { evalInProc { |
︙ | ︙ | |||
588 589 590 591 592 593 594 | list [catch {regsub -gorp a b c} msg] $msg } } {1 {bad option "-gorp": must be -all, -command, -expanded, -line, -linestop, -lineanchor, -nocase, -start, or --}} test regexpComp-11.6 {regsub errors} { evalInProc { list [catch {regsub -nocase a( b c d} msg] $msg } | | | 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 | list [catch {regsub -gorp a b c} msg] $msg } } {1 {bad option "-gorp": must be -all, -command, -expanded, -line, -linestop, -lineanchor, -nocase, -start, or --}} test regexpComp-11.6 {regsub errors} { evalInProc { list [catch {regsub -nocase a( b c d} msg] $msg } } {1 {cannot compile regular expression pattern: parentheses () not balanced}} test regexpComp-11.7 {regsub errors} { evalInProc { unset -nocomplain f1 set f1 44 list [catch {regsub -nocase aaa aaa xxx f1(f2)} msg] $msg } } {1 {can't set "f1(f2)": variable isn't array}} |
︙ | ︙ | |||
966 967 968 969 970 971 972 | } } 0 test regexpComp-24.9 {regexp command compiling tests} { evalInProc { set re "(" list [catch {regexp -- $re dogfod} msg] $msg } | | | 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 | } } 0 test regexpComp-24.9 {regexp command compiling tests} { evalInProc { set re "(" list [catch {regexp -- $re dogfod} msg] $msg } } {1 {cannot compile regular expression pattern: parentheses () not balanced}} test regexpComp-24.10 {regexp command compiling tests} { # Bug 1902436 - last * escaped evalInProc { set text {this is *bold* !} set re {\*bold\*} regexp -- $re $text } |
︙ | ︙ |
Changes to tests/safe.test.
︙ | ︙ | |||
1366 1367 1368 1369 1370 1371 1372 | catch {teststaticlibrary Safepfx1 0 0} test safe-10.1 {testing statics loading} -constraints tcl::test -setup { set i [safe::interpCreate] } -body { interp eval $i {load {} Safepfx1} } -returnCodes error -cleanup { safe::interpDelete $i | | | | 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 | catch {teststaticlibrary Safepfx1 0 0} test safe-10.1 {testing statics loading} -constraints tcl::test -setup { set i [safe::interpCreate] } -body { interp eval $i {load {} Safepfx1} } -returnCodes error -cleanup { safe::interpDelete $i } -result {load of library for prefix Safepfx1 failed: cannot use library in a safe interpreter: no Safepfx1_SafeInit procedure} test safe-10.1.1 {testing statics loading} -constraints tcl::test -setup { set i [safe::interpCreate] } -body { catch {interp eval $i {load {} Safepfx1}} m o dict get $o -errorinfo } -cleanup { unset -nocomplain m o safe::interpDelete $i } -result {load of library for prefix Safepfx1 failed: cannot use library in a safe interpreter: no Safepfx1_SafeInit procedure invoked from within "load {} Safepfx1" invoked from within "interp eval $i {load {} Safepfx1}"} test safe-10.2 {testing statics loading / -nostatics} -constraints tcl::test -body { set i [safe::interpCreate -nostatics] interp eval $i {load {} Safepfx1} |
︙ | ︙ | |||
1398 1399 1400 1401 1402 1403 1404 | safe::interpDelete $i } -result {permission denied (nested load)} test safe-10.4 {testing nested statics loading / -nestedloadok} -constraints tcl::test -body { set i [safe::interpCreate -nestedloadok] interp eval $i {interp create x; load {} Safepfx1 x} } -returnCodes error -cleanup { safe::interpDelete $i | | | | 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 | safe::interpDelete $i } -result {permission denied (nested load)} test safe-10.4 {testing nested statics loading / -nestedloadok} -constraints tcl::test -body { set i [safe::interpCreate -nestedloadok] interp eval $i {interp create x; load {} Safepfx1 x} } -returnCodes error -cleanup { safe::interpDelete $i } -result {load of library for prefix Safepfx1 failed: cannot use library in a safe interpreter: no Safepfx1_SafeInit procedure} test safe-10.4.1 {testing nested statics loading / -nestedloadok} -constraints tcl::test -body { set i [safe::interpCreate -nestedloadok] catch {interp eval $i {interp create x; load {} Safepfx1 x}} m o dict get $o -errorinfo } -cleanup { unset -nocomplain m o safe::interpDelete $i } -result {load of library for prefix Safepfx1 failed: cannot use library in a safe interpreter: no Safepfx1_SafeInit procedure invoked from within "load {} Safepfx1 x" invoked from within "interp eval $i {interp create x; load {} Safepfx1 x}"} ### 11. Safe encoding. |
︙ | ︙ |
Changes to tests/switch.test.
︙ | ︙ | |||
188 189 190 191 192 193 194 | test switch-5.1 {errors in -regexp matching} -returnCodes error -body { switch -regexp aaaab { *b {subst glob} aaaab {subst exact} default {subst none} } | | | 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 | test switch-5.1 {errors in -regexp matching} -returnCodes error -body { switch -regexp aaaab { *b {subst glob} aaaab {subst exact} default {subst none} } } -result {cannot compile regular expression pattern: invalid quantifier operand} test switch-6.1 {backslashes in patterns} { switch -exact {\a\$\.\[} { \a\$\.\[ {subst first} \a\\$\.\\[ {subst second} \\a\\$\\.\\[ {subst third} {\a\\$\.\\[} {subst fourth} |
︙ | ︙ |
Changes to tests/unixInit.test.
︙ | ︙ | |||
92 93 94 95 96 97 98 99 100 101 102 | puts $f {puts [encoding system]; exit} set enc [gets $f] close $f set enc } -cleanup { unset -nocomplain env(LANG) } -match regexp -result {^(iso8859-15?|utf-8)$} test unixInit-3.2 {TclpSetInitialEncodings} -setup { catch {set oldlc_all $env(LC_ALL)} catch {set oldtcl_library $env(TCL_LIBRARY)} unset -nocomplain env(TCL_LIBRARY) | > > > > > > > > > > > > > > > | | 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 | puts $f {puts [encoding system]; exit} set enc [gets $f] close $f set enc } -cleanup { unset -nocomplain env(LANG) } -match regexp -result {^(iso8859-15?|utf-8)$} # unixInit-3.2 depends on the *spawned* [interpreter] being able to locate # tcl_library without setting of TCL_LIBRARY env. This in turn depends on # Tcl's "library" directory being under the parent or grandparent of the # executable directory (the initScript search path in tclInterp.c). # Thus this constraint. On GiuHub CI, the only time this is not true # is for the XCode builds. if {[string match [zipfs root]* [info library]] || [file isfile [file normalize [file join [info nameofexecutable] .. .. library init.tcl]]] || [file isfile [file normalize [file join [info nameofexecutable] .. .. .. library init.tcl]]] } { tcltest::testConstraint enableUnixInit32 1 } else { tcltest::testConstraint enableUnixInit32 0 } test unixInit-3.2 {TclpSetInitialEncodings} -setup { catch {set oldlc_all $env(LC_ALL)} catch {set oldtcl_library $env(TCL_LIBRARY)} unset -nocomplain env(TCL_LIBRARY) } -constraints {unix stdio enableUnixInit32} -body { set env(LANG) japanese set env(LC_ALL) japanese set f [open "|[list [interpreter]]" w+] chan configure $f -buffering none puts $f {puts [encoding system]; exit} set enc [gets $f] close $f |
︙ | ︙ |
Changes to tests/utfext.test.
1 | # This file contains a collection of tests for Tcl_UtfToExternal and | | | > > | > > > > > > | > > > > > > > > > > > | | > | > > > > > > > > > > > > > > > > > > > | | | | | > > | > > > > | > > > | > > > > > > > > > > > > > > > > > > > > | > | | > > > > | > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > | | | | | | | | | | > | > > | > > | > > > > > | > > > > > | > > > > | > > > > | > > > > > > > > > > | | > > | > > > > > | > > > > | > > > > > > > > > > | | | | > | > | > > > > > > | > > > > > | > > > | > > > > | > > > > > > > > > > | > | < | | | | > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 | # This file contains a collection of tests for Tcl_UtfToExternal and # Tcl_UtfToExternal that exercise various combinations of flags, # buffer lengths and fragmentation that cannot be tested by # normal script level commands. There tests are NOT intended to check # correct encodings; those are elsewhere. # # Copyright (c) 2023 Ashok P. Nadkarni # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. if {"::tcltest" ni [namespace children]} { package require tcltest 2.5 namespace import -force ::tcltest::* } ::tcltest::loadTestedCommands catch [list package require -exact tcl::test [info patchlevel]] testConstraint testbytestring [llength [info commands testbytestring]] testConstraint testencoding [llength [info commands testencoding]] namespace eval utftest { # Format of table, indexed by encoding. The encodings are not exhaustive # but one of each kind of encoding transform (algorithmic, table-driven, # stateful, DBCS, MBCS). # Each element is list of lists. Nested lists have following fields # 0 comment (no spaces, might be used to generate id's as well) # The combination of comment and internal hex (2) should be unique. # 1 hex representation of internal *modified* utf-8 encoding. This is the # source string for Tcl_UtfToExternal and expected result for # Tcl_ExternalToUtf. # 2 hex representation in specified encoding. This is the source string for # Tcl_ExternalToUtf and expected result for Tcl_UtfToExternal. # 3 internal fragmentation index - where to split field 1 for fragmentation # tests. -1 to skip # 4 external fragmentation index - where to split field 2 for fragmentation # tests. -1 to skip # # THE HEX DEFINITIONS SHOULD SEPARATE EACH CHARACTER BY WHITESPACE # (assumed by the charlimit tests) lappend utfExtMap {*}{ ascii { {basic {41 42 43} {41 42 43} -1 -1} } utf-8 { {bmp {41 c3a9 42} {41 c3a9 42} 2 2} {nonbmp-frag-1 {41 f09f9880 42} {41 f09f9880 42} 2 2} {nonbmp-frag-2 {41 f09f9880 42} {41 f09f9880 42} 3 3} {nonbmp-frag-3 {41 f09f9880 42} {41 f09f9880 42} 4 4} {null {41 c080 42} {41 00 42} 2 -1} } cesu-8 { {bmp {41 c3a9 42} {41 c3a9 42} 2 2} {nonbmp-frag-surr-low {41 f09f9880 42} {41 eda0bd edb880 42} 2 2} {nonbmp-split-surr {41 f09f9880 42} {41 eda0bd edb880 42} 3 -1} {nonbmp-frag-surr-high {41 f09f9880 42} {41 eda0bd edb880 42} 4 6} {null {41 c080 42} {41 00 42} 2 -1} } utf-16le { {bmp {41 c3a9 42} {4100 e900 4200} 2 3} {nonbmp {41 f09f9880 42} {4100 3dd8 00de 4200} 4 3} {split-surrogate {41 f09f9080 42} {4100 3dd8 00dc 4200} 3 4} {null {41 c080 42} {4100 0000 4200} 2 3} } utf-16be { {bmp {41 c3a9 42} {0041 00e9 0042} 2 3} {nonbmp {41 f09f9880 42} {0041 d83d de00 0042} 4 3} {split-surrogate {41 f09f9080 42} {0041 d83d dc00 0042} 3 4} {null {41 c080 42} {0041 0000 0042} 2 3} } utf-32le { {bmp {41 c3a9 42} {41000000 e9000000 42000000} 2 3} {nonbmp {41 f09f9880 42} {41000000 00f60100 42000000} 4 6} {null {41 c080 42} {41000000 00000000 42000000} 2 3} } utf-32be { {bmp {41 c3a9 42} {00000041 000000e9 00000042} 2 3} {nonbmp {41 f09f9880 42} {00000041 0001f600 00000042} 4 3} {null {41 c080 42} {00000041 00000000 00000042} 2 3} } iso8859-1 { {basic {41 c3a9 42} {41 e9 42} 2 -1} {null {41 c080 42} {41 00 42} 2 -1} } iso8859-3 { {basic {41 c4a0 42} {41 d5 42} 2 -1} {null {41 c080 42} {41 00 42} 2 -1} } shiftjis { {basic {41 e4b98e 42} {41 8cc1 42} 3 2} } jis0208 { {basic {e4b98e e590be} {3843 3863} 1 1} } iso2022-jp { {frag-in-leadescape {58 e4b98e 5a} {58 1b2442 3843 1b2842 5a} 2 2} {frag-in-char {58 e4b98e 5a} {58 1b2442 3843 1b2842 5a} 2 5} {frag-in-trailescape {58 e4b98e 5a} {58 1b2442 3843 1b2842 5a} 2 8} } } # Return a binary string containing nul terminator for encoding proc hexnuls {enc} { return [binary encode hex [encoding convertto $enc \x00]] } # The C wrapper fills entire destination buffer with FF. # Anything beyond expected output should have FF's proc fill {bin buflen} { return [string range "$bin[string repeat \xFF $buflen]" 0 $buflen-1] } proc testutf {direction enc comment hexin hexout args} { set id $comment-[join $hexin ""] if {$direction eq "toutf"} { set cmd Tcl_ExternalToUtf } else { set cmd Tcl_UtfToExternal } set in [binary decode hex $hexin] set out [binary decode hex $hexout] set dstlen 40 ;# Should be enough for all encoding tests set status ok set flags [list start end] set constraints [list testencoding] set profiles [encoding profiles] while {[llength $args] > 1} { set opt [lpop args 0] switch $opt { -flags { set flags [lpop args 0] } -constraints { lappend constraints {*}[lpop args 0] } -profiles { set profiles [lpop args 0] } -status { set status [lpop args 0]} default { error "Unknown option \"$opt\"" } } } if {[llength $args]} { error "No value supplied for option [lindex $args 0]." } set result [list $status {} [fill $out $dstlen]] test $cmd-$enc-$id-[join $flags -] "$cmd - $enc - $hexin - $flags" -body \ [list testencoding $cmd $enc $in $flags {} $dstlen] \ -result $result -constraints $constraints foreach profile $profiles { set flags2 [linsert $flags end $profile] test $cmd-$enc-$id-[join $flags2 -] "$cmd - $enc - $hexin - $flags2" -body \ [list testencoding $cmd $enc $in $flags2 {} $dstlen] \ -result $result -constraints $constraints } } proc testfragment {direction enc comment hexin hexout fragindex args} { if {$fragindex < 0} { # Single byte encodings so no question of fragmentation return } set id $comment-[join $hexin ""]-fragment if {$direction eq "toutf"} { set cmd Tcl_ExternalToUtf } else { set cmd Tcl_UtfToExternal } set status1 multibyte; # Return status to expect after first call while {[llength $args] > 1} { set opt [lpop args 0] switch $opt { -status1 { set status1 [lpop args 0]} default { error "Unknown option \"$opt\"" } } } set in [binary decode hex $hexin] set infrag [string range $in 0 $fragindex-1] set out [binary decode hex $hexout] set dstlen 40 ;# Should be enough for all encoding tests test $cmd-$enc-$id "$cmd - $enc - $hexin - frag" -constraints testencoding -body { set frag1Result [testencoding $cmd $enc [string range $in 0 $fragindex-1] {start} 0 $dstlen frag1Read frag1Written] lassign $frag1Result frag1Status frag1State frag1Decoded set frag2Result [testencoding $cmd $enc [string range $in $frag1Read end] {end} $frag1State $dstlen frag2Read frag2Written] lassign $frag2Result frag2Status frag2State frag2Decoded set decoded [string cat [string range $frag1Decoded 0 $frag1Written-1] [string range $frag2Decoded 0 $frag2Written-1]] list $frag1Status [expr {$frag1Read <= $fragindex}] \ $frag2Status [expr {$frag1Read+$frag2Read}] \ [expr {$frag1Written+$frag2Written}] $decoded } -result [list $status1 1 ok [string length $in] [string length $out] $out] } proc testcharlimit {direction enc comment hexin hexout} { set id $comment-[join $hexin ""]-charlimit if {$direction eq "toutf"} { set cmd Tcl_ExternalToUtf } else { set cmd Tcl_UtfToExternal } set maxchars [llength $hexout] set in [binary decode hex $hexin] set out [binary decode hex $hexout] set dstlen 40 ;# Should be enough for all encoding tests for {set nchars 0} {$nchars <= $maxchars} {incr nchars} { set expected_bytes [binary decode hex [lrange $hexout 0 $nchars-1]] set expected_nwritten [string length $expected_bytes] test $cmd-$enc-$id-$nchars "$cmd - $enc - $hexin - nchars $nchars" -constraints testencoding -body { set charlimit $nchars lassign [testencoding $cmd $enc $in \ {start end charlimit} 0 $dstlen nread nwritten charlimit] \ status state buf list $status $nwritten [string range $buf 0 $nwritten-1] } -result [list [expr {$nchars == $maxchars ? "ok" : "nospace"}] $expected_nwritten $expected_bytes] } } # # Basic tests foreach {enc testcases} $utfExtMap { foreach testcase $testcases { lassign $testcase {*}{comment utfhex hex internalfragindex externalfragindex} # Basic test - TCL_ENCODING_START|TCL_ENCODING_END # Note by default output should be terminated with \0 set encnuls [hexnuls $enc] testutf toutf $enc $comment $hex ${utfhex}00 testutf fromutf $enc $comment $utfhex $hex$encnuls # Test TCL_ENCODING_NO_TERMINATE testutf toutf $enc $comment $hex $utfhex -flags {start end noterminate} # noterminate is specific to ExternalToUtf, # should have no effect in other direction testutf fromutf $enc $comment $utfhex $hex$encnuls -flags {start end noterminate} # Fragments testfragment toutf $enc $comment $hex $utfhex $externalfragindex testfragment fromutf $enc $comment $utfhex $hex $internalfragindex # Char limits - note no fromutf as Tcl_UtfToExternal does not support it testcharlimit toutf $enc $comment $hex $utfhex } } # Special cases - cesu2 high and low surrogates in separate fragments # This will (correctly) return "ok", not "multibyte" after first frag testfragment toutf cesu-8 nonbmp-split-surr \ {41 eda0bd edb880 42} {41 f09f9880 42} 4 -status1 ok # Bug regression tests test Tcl_UtfToExternal-bug-183a1adcc0 {buffer overflow} -body { testencoding Tcl_UtfToExternal utf-16 A {start end} {} 1 } -result [list nospace {} \xFF] -constraints testencoding test Tcl_ExternalToUtf-bug-5be203d6ca { truncated prefix in table encoding } -body { set src \x82\x4F\x82\x50\x82 set result [list [testencoding Tcl_ExternalToUtf shiftjis $src {start tcl8} 0 16 srcRead dstWritten charsWritten] $srcRead $dstWritten $charsWritten] lappend result {*}[list [testencoding Tcl_ExternalToUtf shiftjis [string range $src $srcRead end] {end tcl8} 0 10 srcRead dstWritten charsWritten] $srcRead $dstWritten $charsWritten] } -result [list [list multibyte 0 \xEF\xBC\x90\xEF\xBC\x91\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF] 4 6 2 [list ok 0 \xC2\x82\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF] 1 2 1] -constraints testencoding } namespace delete utftest ::tcltest::cleanupTests return # Local Variables: # mode: tcl # End: |
Changes to tests/zipfs.test.
︙ | ︙ | |||
23 24 25 26 27 28 29 | set ziproot [zipfs root] set CWD [pwd] set tmpdir [file join $CWD tmp] file mkdir $tmpdir | < < < | 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | set ziproot [zipfs root] set CWD [pwd] set tmpdir [file join $CWD tmp] file mkdir $tmpdir test zipfs-0.1 {zipfs basics} -constraints zipfs -body { expr {${ziproot} in [file volumes]} } -result 1 if {[string match ${ziproot}* $tcl_library]} { testConstraint zipfslib 1 set zipLibTop [file tail [file join {*}[lrange [file split $tcl_library] 0 1]]] |
︙ | ︙ | |||
151 152 153 154 155 156 157 | test zipfs-2.8 {zipfs mkzip} -constraints zipfs -body { cd $tcl_library/encoding zipfs mkzip $zipfile . set fin [open $zipfile r] fconfigure $fin -translation binary set dat [read $fin] close $fin | | | 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 | test zipfs-2.8 {zipfs mkzip} -constraints zipfs -body { cd $tcl_library/encoding zipfs mkzip $zipfile . set fin [open $zipfile r] fconfigure $fin -translation binary set dat [read $fin] close $fin zipfs mountdata $dat def zipfs list -glob ${ziproot}def/cp850.* } -cleanup { cd $CWD } -result "${ziproot}def/cp850.enc" testConstraint zipfsencbuf [zipfs exists ${ziproot}def/cp850.enc] test zipfs-2.9 {zipfs info} -constraints {zipfs zipfsencbuf} -body { set r [zipfs info ${ziproot}def/cp850.enc] |
︙ | ︙ | |||
207 208 209 210 211 212 213 | set interp [interp create] } -body { interp eval $interp { zipfs ? } } -returnCodes error -cleanup { interp delete $interp | | > | | | | | 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 | set interp [interp create] } -body { interp eval $interp { zipfs ? } } -returnCodes error -cleanup { interp delete $interp } -result {unknown or ambiguous subcommand "?": must be canonical, exists, find, info, list, lmkimg, lmkzip, mkimg, mkkey, mkzip, mount, mountdata, root, or unmount} test zipfs-3.2 {zipfs in child interpreters} -constraints zipfs -setup { set interp [interp create] } -body { interp eval $interp { zipfs mkzip } } -returnCodes error -cleanup { interp delete $interp } -result {wrong # args: should be "zipfs mkzip outfile indir ?strip? ?password?"} test zipfs-3.3 {zipfs in child interpreters} -constraints zipfs -setup { set safe [interp create -safe] } -body { interp eval $safe { zipfs ? } } -returnCodes error -cleanup { interp delete $safe } -result {invalid command name "zipfs"} test zipfs-3.4 {zipfs in safe interpreters} -constraints zipfs -setup { set safe [interp create -safe] } -body { interp eval $safe { zipfs } } -returnCodes error -cleanup { interp delete $safe } -result {invalid command name "zipfs"} test zipfs-4.1 {zipfs lmkimg} -constraints zipfs -setup { set baseImage [makeFile "return sourceWorking\n\x1A" base] set targetImage [makeFile "" target] set addFile [makeFile "return mountWorking" add.data] file delete $targetImage } -body { |
︙ | ︙ | |||
346 347 348 349 350 351 352 | zipfs unmount ziptest removeFile $baseImage removeFile $midImage removeFile $targetImage removeFile $addFile } -result [list ${ziproot}/ziptest/test/add.tcl ${ziproot}/ziptest/test/ok.tcl] | | | | | | | | 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 | zipfs unmount ziptest removeFile $baseImage removeFile $midImage removeFile $targetImage removeFile $addFile } -result [list ${ziproot}/ziptest/test/add.tcl ${ziproot}/ziptest/test/ok.tcl] test zipfs-5.1 {zipfs mountdata: short data} -constraints zipfs -body { zipfs mountdata {} gorp } -returnCodes error -result {illegal file size} test zipfs-5.2 {zipfs mountdata: short data} -constraints zipfs -body { zipfs mountdata gorpGORPgorp gorp } -returnCodes error -result {illegal file size} test zipfs-5.3 {zipfs mountdata: short data} -constraints zipfs -body { set data PK\x03\x04..................................... append data PK\x01\x02..................................... append data PK\x05\x06..................................... zipfs mountdata $data gorp } -returnCodes error -result {archive directory truncated} test zipfs-6.1 {zipfs mkkey} -constraints zipfs -body { binary scan [zipfs mkkey gorp] cu* x return $x } -result {224 226 111 103 4 80 75 90 90} |
︙ | ︙ | |||
444 445 446 447 448 449 450 | cleanup } -result {1 1 {}} {*}$args if {![file exists $zippath]} { return } set data [readbin $zippath] | | | | | | | | | | | 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 | cleanup } -result {1 1 {}} {*}$args if {![file exists $zippath]} { return } set data [readbin $zippath] test zipfs-mountdata-$id $id -body { list [catch {zipfs mountdata $data $defMountPt} message] \ [string match $messagePattern $message] \ [mounttarget $defMountPt] } -cleanup { # In case mount succeeded when it should not cleanup } -result {1 1 {}} {*}$args } # Generates tests for file, file on root, memory buffer cases for an archive proc testmount {id zippath checkPath mountpoint args} { set zippath [zippath $zippath] test zipfs-mount-$id "zipfs mount $id" -body { set canon [mount $zippath $mountpoint] list [file exists [file join $canon $checkPath]] \ [zipfs mount $canon] [zipfs mount $mountpoint] } -cleanup { zipfs unmount $mountpoint } -result [list 1 $zippath $zippath] {*}$args # Mount memory buffer test zipfs-mountdata-$id "zipfs mountdata $id" -body { set canon [zipfs mountdata [readbin $zippath] $mountpoint] list [file exists [file join $canon $checkPath]] \ [zipfs mount $canon] [zipfs mount $mountpoint] } -cleanup { cleanup } -result [list 1 {Memory Buffer} {Memory Buffer}] {*}$args } testnumargs "zipfs mount" "" "?zipfile? ?mountpoint? ?password?" testnumargs "zipfs mountdata" "data mountpoint" "" # Not supported zip files testbadmount non-existent-file nosuchfile.zip "couldn't open*nosuchfile.zip*no such file or directory" testbadmount not-zipfile [file normalize [info script]] "archive directory end signature not found" testbadmount zip64-unsupported zip64.zip "wrong header signature" # Inconsistent metadata testbadmount bad-directory-offset incons-cdoffset.zip "archive directory truncated" testbadmount bad-directory-magic incons-central-magic-bad.zip "wrong header signature" testbadmount bad-local-magic incons-local-magic-bad.zip "Failed to find local header" testbadmount bad-file-count-high incons-file-count-high.zip "truncated directory" testbadmount bad-file-count-low incons-file-count-low.zip "short file count" test zipfs-mount-on-drive "Mount point include drive" -body { zipfs mount [zippath test.zip] C:/foo } -result {Invalid mount path "C:/foo"} -returnCodes error -constraints win test zipfs-mountdata-on-drive "Mount point include drive" -body { zipfs mountdata [readbin [zippath test.zip]] C:/foo } -result {Invalid mount path "C:/foo"} -returnCodes error -constraints win test zipfs-mount-on-unc "Mount point is unc" -body { zipfs mount [zippath test.zip] //unc/share/foo } -result {Invalid mount path "//unc/share/foo"} -returnCodes error test zipfs-mountdata-on-unc "Mount point include unc" -body { zipfs mountdata [readbin [zippath test.zip]] //unc/share/foo } -result {Invalid mount path "//unc/share/foo"} -returnCodes error # Good mounts testmount basic test.zip testdir/test2 $defMountPt testmount basic-on-default test.zip testdir/test2 "" testmount basic-on-root test.zip testdir/test2 [zipfs root] testmount basic-on-slash test.zip testdir/test2 / |
︙ | ︙ | |||
717 718 719 720 721 722 723 | } -result $resultpaths {*}$args # Mount memory buffer test zipfs-list-memory-$id "zipfs list memory $id" -body { lsort [zipfs list {*}$cmdargs] } -setup { foreach {zippath mountpoint} $mounts { | | | 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 | } -result $resultpaths {*}$args # Mount memory buffer test zipfs-list-memory-$id "zipfs list memory $id" -body { lsort [zipfs list {*}$cmdargs] } -setup { foreach {zippath mountpoint} $mounts { zipfs mountdata [readbin [zippath $zippath]] [file join [zipfs root] $mountpoint] } } -cleanup { cleanup } -result $resultpaths {*}$args } # Some tests have !zipfslib constraint because otherwise they dump the entire Tcl library which is mounted on root testzipfslist no-mounts "" {} {} -constraints !zipfslib |
︙ | ︙ | |||
783 784 785 786 787 788 789 | set setup { foreach {zippath mountpoint} $mounts { zipfs mount [zippath $zippath] [file join [zipfs root] $mountpoint] } } set memory_setup { foreach {zippath mountpoint} $mounts { | | | 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 | set setup { foreach {zippath mountpoint} $mounts { zipfs mount [zippath $zippath] [file join [zipfs root] $mountpoint] } } set memory_setup { foreach {zippath mountpoint} $mounts { zipfs mountdata [readbin [zippath $zippath]] [file join [zipfs root] $mountpoint] } } if {[dict exists $args -setup]} { append setup \n[dict get $args -setup] append memory_setup \n[dict get $args -setup] dict unset args -setup } |
︙ | ︙ | |||
978 979 980 981 982 983 984 | set fd [open [file join $defMountPt $filename] {*}$openopts] gets $fd } -result $result {*}$args set data [readbin $zippath] test zipfs-read-memory-$id "zipfs read in-memory $id" -setup { unset -nocomplain fd | | | 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 | set fd [open [file join $defMountPt $filename] {*}$openopts] gets $fd } -result $result {*}$args set data [readbin $zippath] test zipfs-read-memory-$id "zipfs read in-memory $id" -setup { unset -nocomplain fd zipfs mountdata $data $defMountPt } -cleanup { # In case open succeeded when it should not if {[info exists fd]} { close $fd } cleanup } -body { |
︙ | ︙ | |||
1051 1052 1053 1054 1055 1056 1057 | } cleanup } -body $body -result $result {*}$args set data [readbin $zippath] test zipfs-write-memory-$id "zipfs write in-memory $id" -setup { unset -nocomplain fd | | | 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 | } cleanup } -body $body -result $result {*}$args set data [readbin $zippath] test zipfs-write-memory-$id "zipfs write in-memory $id" -setup { unset -nocomplain fd zipfs mountdata $data $defMountPt } -cleanup { # In case open succeeded when it should not if {[info exists fd]} { close $fd } cleanup } -body $body -result $result {*}$args |
︙ | ︙ | |||
1209 1210 1211 1212 1213 1214 1215 | } cleanup } -body $body -result $expected {*}$args set data [readbin $zippath] test zipfs-rw-memory-$id "zipfs read/seek/write in-memory $id" -setup { unset -nocomplain fd | | | 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 | } cleanup } -body $body -result $expected {*}$args set data [readbin $zippath] test zipfs-rw-memory-$id "zipfs read/seek/write in-memory $id" -setup { unset -nocomplain fd zipfs mountdata $data $defMountPt } -cleanup { # In case open succeeded when it should not if {[info exists fd]} { close $fd } cleanup } -body $body -result $expected {*}$args |
︙ | ︙ | |||
1347 1348 1349 1350 1351 1352 1353 | cleanup } -body { set fd [open [file join $defMountPt $filename]] } -result $result -returnCodes error {*}$args # Mount memory buffer test zipfs-crc-memory-$id "zipfs crc memory $id" -setup { | | | 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 | cleanup } -body { set fd [open [file join $defMountPt $filename]] } -result $result -returnCodes error {*}$args # Mount memory buffer test zipfs-crc-memory-$id "zipfs crc memory $id" -setup { zipfs mountdata [readbin [zippath $zippath]] $defMountPt } -cleanup { cleanup } -body { set fd [open [file join $defMountPt $filename]] } -result $result -returnCodes error {*}$args } testcrc local incons-local-crc.zip a "invalid CRC" |
︙ | ︙ | |||
1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 | thread } -body { set before [lsort [zipfs mount]] thread::release [thread::create] after 100; # Needed to allow the spawned thread to exit to trigger bug string equal $before [lsort [zipfs mount]] } -result 1 } ::tcltest::cleanupTests return # Local Variables: # mode: tcl # End: | > > > > > > > > > > > > > > > > | 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 | thread } -body { set before [lsort [zipfs mount]] thread::release [thread::create] after 100; # Needed to allow the spawned thread to exit to trigger bug string equal $before [lsort [zipfs mount]] } -result 1 test bug-7d5f1c1308 "zipfs error on dotfiles" -setup { set basename bug-7d5f1c1308 set mt //zipfs:/$basename-mt set zipfile $basename.zip set dir [makeDirectory $basename] close [open [file join $dir .ext] w] } -cleanup { zipfs unmount $mt file delete $zipfile removeDirectory $basename } -body { zipfs mkzip $zipfile $dir [file dirname $dir] zipfs mount $zipfile $mt lsort [zipfs list $mt/*] } -result {//zipfs:/bug-7d5f1c1308-mt/bug-7d5f1c1308 //zipfs:/bug-7d5f1c1308-mt/bug-7d5f1c1308/.ext} } ::tcltest::cleanupTests return # Local Variables: # mode: tcl # End: |
Changes to tests/zlib.test.
︙ | ︙ | |||
1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 | lappend result $size $size2 ->$size3 } return $result } -cleanup { chan close $src chan close $dst } -result {5 5 ->5 5 5 ->5 5 5 ->5} ::tcltest::cleanupTests return # Local Variables: # mode: tcl | > > > > > > > > > > | 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 | lappend result $size $size2 ->$size3 } return $result } -cleanup { chan close $src chan close $dst } -result {5 5 ->5 5 5 ->5 5 5 ->5} test zlib-15.1 {Bug cfdf80a2efc6 - negative checksums} -setup { set compressor [zlib stream gzip -header {comment "A zlib demo"}] $compressor put abcd $compressor finalize } -body { $compressor checksum } -cleanup { $compressor close } -result 3984772369 ::tcltest::cleanupTests return # Local Variables: # mode: tcl |
︙ | ︙ |
Changes to tools/regexpTestLib.tcl.
︙ | ︙ | |||
52 53 54 55 56 57 58 | lappend newLs $newItem } return $newLs } proc convertErrCode {code} { | | | 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | lappend newLs $newItem } return $newLs } proc convertErrCode {code} { set errMsg "cannot compile regular expression pattern:" if {[string compare $code "INVARG"] == 0} { return "$errMsg invalid argument to regex routine" } elseif {[string compare $code "BADRPT"] == 0} { return "$errMsg ?+* follows nothing" } elseif {[string compare $code "BADBR"] == 0} { return "$errMsg invalid repetition count(s)" |
︙ | ︙ |
Changes to tools/tclOOScript.tcl.
︙ | ︙ | |||
466 467 468 469 470 471 472 | # Also includes the commands: # # * readableproperties # * writableproperties # * objreadableproperties # * objwritableproperties # | | > > > > > > > > | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < > > | < < < < < | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | < < | < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 | # Also includes the commands: # # * readableproperties # * writableproperties # * objreadableproperties # * objwritableproperties # # These are all slot implementations that provide access to the C layer # of property support (i.e., very fast cached lookup of property names). # # * StdClassProperties # * StdObjectPropertes # # These cause very fast basic implementation methods for a property # following the standard model of property implementation naming. # Property schemes that use other models (such as to be more Tk-like) # should not use these (or the oo::cconfigurable metaclass). # # ---------------------------------------------------------------------- namespace eval configuresupport { # ------------------------------------------------------------------ # # oo::configuresupport::configurableclass, # oo::configuresupport::configurableobject -- # # Namespaces used as implementation vectors for oo::define and # oo::objdefine when the class/instance is configurable. # Note that these also contain commands implemented in C, # especially the [property] definition command. # # ------------------------------------------------------------------ ::namespace eval configurableclass { # Plural alias just in case; deliberately NOT documented! ::proc properties args {::tailcall property {*}$args} ::namespace path ::oo::define ::namespace export property } ::namespace eval configurableobject { # Plural alias just in case; deliberately NOT documented! ::proc properties args {::tailcall property {*}$args} ::namespace path ::oo::objdefine ::namespace export property } # ------------------------------------------------------------------ # # oo::configuresupport::configurable -- # # The class that contains the implementation of the actual # 'configure' method (mixed into actually configurable classes). # The 'configure' method is in tclOOBasic.c. # # ------------------------------------------------------------------ ::oo::define configurable { definitionnamespace -instance configurableobject definitionnamespace -class configurableclass } } # ---------------------------------------------------------------------- # |
︙ | ︙ |
Changes to unix/Makefile.in.
1 2 3 4 5 6 | # # This file is a Makefile for Tcl. If it has the name "Makefile.in" then it is # a template for a Makefile; to generate the actual Makefile, run # "./configure", which is a configuration script generated by the "autoconf" # program (constructs like "@foo@" will get replaced in the actual Makefile. | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | # # This file is a Makefile for Tcl. If it has the name "Makefile.in" then it is # a template for a Makefile; to generate the actual Makefile, run # "./configure", which is a configuration script generated by the "autoconf" # program (constructs like "@foo@" will get replaced in the actual Makefile. VERSION = @TCL_VERSION@ MAJOR_VERSION = @TCL_MAJOR_VERSION@ MINOR_VERSION = @TCL_MINOR_VERSION@ PATCH_LEVEL = @TCL_PATCH_LEVEL@ #-------------------------------------------------------------------------- # Things you can change to personalize the Makefile for your own site (you can # make these changes in either Makefile.in or Makefile, but changes to |
︙ | ︙ | |||
317 318 319 320 321 322 323 | tclResolve.o tclResult.o tclScan.o tclStringObj.o tclStrIdxTree.o \ tclStrToD.o tclThread.o \ tclThreadAlloc.o tclThreadJoin.o tclThreadStorage.o tclStubInit.o \ tclTimer.o tclTrace.o tclUtf.o tclUtil.o tclVar.o tclZlib.o \ tclTomMathInterface.o tclZipfs.o OO_OBJS = tclOO.o tclOOBasic.o tclOOCall.o tclOODefineCmds.o tclOOInfo.o \ | | | 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 | tclResolve.o tclResult.o tclScan.o tclStringObj.o tclStrIdxTree.o \ tclStrToD.o tclThread.o \ tclThreadAlloc.o tclThreadJoin.o tclThreadStorage.o tclStubInit.o \ tclTimer.o tclTrace.o tclUtf.o tclUtil.o tclVar.o tclZlib.o \ tclTomMathInterface.o tclZipfs.o OO_OBJS = tclOO.o tclOOBasic.o tclOOCall.o tclOODefineCmds.o tclOOInfo.o \ tclOOMethod.o tclOOProp.o tclOOStubInit.o TOMMATH_OBJS = bn_s_mp_reverse.o bn_s_mp_mul_digs_fast.o \ bn_s_mp_sqr_fast.o bn_mp_add.o bn_mp_and.o \ bn_mp_add_d.o bn_mp_clamp.o bn_mp_clear.o bn_mp_clear_multi.o \ bn_mp_cmp.o bn_mp_cmp_d.o bn_mp_cmp_mag.o \ bn_mp_cnt_lsb.o bn_mp_copy.o \ bn_mp_count_bits.o bn_mp_div.o bn_mp_div_d.o bn_mp_div_2.o \ |
︙ | ︙ | |||
490 491 492 493 494 495 496 497 498 499 500 501 502 503 | OO_SRCS = \ $(GENERIC_DIR)/tclOO.c \ $(GENERIC_DIR)/tclOOBasic.c \ $(GENERIC_DIR)/tclOOCall.c \ $(GENERIC_DIR)/tclOODefineCmds.c \ $(GENERIC_DIR)/tclOOInfo.c \ $(GENERIC_DIR)/tclOOMethod.c \ $(GENERIC_DIR)/tclOOStubInit.c STUB_SRCS = \ $(GENERIC_DIR)/tclStubLib.c \ $(GENERIC_DIR)/tclStubCall.c \ $(GENERIC_DIR)/tclStubLibTbl.c \ $(GENERIC_DIR)/tclTomMathStubLib.c \ | > | 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 | OO_SRCS = \ $(GENERIC_DIR)/tclOO.c \ $(GENERIC_DIR)/tclOOBasic.c \ $(GENERIC_DIR)/tclOOCall.c \ $(GENERIC_DIR)/tclOODefineCmds.c \ $(GENERIC_DIR)/tclOOInfo.c \ $(GENERIC_DIR)/tclOOMethod.c \ $(GENERIC_DIR)/tclOOProp.c \ $(GENERIC_DIR)/tclOOStubInit.c STUB_SRCS = \ $(GENERIC_DIR)/tclStubLib.c \ $(GENERIC_DIR)/tclStubCall.c \ $(GENERIC_DIR)/tclStubLibTbl.c \ $(GENERIC_DIR)/tclTomMathStubLib.c \ |
︙ | ︙ | |||
802 803 804 805 806 807 808 | ${LIB_FILE}: ${STUB_LIB_FILE} ${OBJS} ${TCL_ZIP_FILE} rm -f $@ @MAKE_LIB@ @if test "${ZIPFS_BUILD}" = "1" ; then \ if test "x$(MACHER)" = "x" ; then \ cat ${TCL_ZIP_FILE} >> ${LIB_FILE}; \ else $(MACHER) append ${LIB_FILE} ${TCL_ZIP_FILE} /tmp/macher_output; \ | | | 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 | ${LIB_FILE}: ${STUB_LIB_FILE} ${OBJS} ${TCL_ZIP_FILE} rm -f $@ @MAKE_LIB@ @if test "${ZIPFS_BUILD}" = "1" ; then \ if test "x$(MACHER)" = "x" ; then \ cat ${TCL_ZIP_FILE} >> ${LIB_FILE}; \ else $(MACHER) append ${LIB_FILE} ${TCL_ZIP_FILE} /tmp/macher_output; \ mv /tmp/macher_output ${LIB_FILE}; chmod u+x ${LIB_FILE}; \ fi; \ ${NATIVE_ZIP} -A ${LIB_FILE} \ || echo 'ignore zip-error by adjust sfx process (not executable?)'; \ fi ${STUB_LIB_FILE}: ${STUB_LIB_OBJS} @if [ "x${LIB_FILE}" = "xlibtcl${MAJOR_VERSION}.${MINOR_VERSION}.dll" ] ; then \ |
︙ | ︙ | |||
833 834 835 836 837 838 839 | ${CC} ${CFLAGS} ${LDFLAGS} ${TCLSH_OBJS} \ @TCL_BUILD_LIB_SPEC@ ${TCL_STUB_LIB_FILE} ${LIBS} @EXTRA_TCLSH_LIBS@ \ ${CC_SEARCH_FLAGS} -o ${TCL_EXE} @if test "${ZIPFS_BUILD}" = "2" ; then \ if test "x$(MACHER)" = "x" ; then \ cat ${TCL_ZIP_FILE} >> ${TCL_EXE}; \ else $(MACHER) append ${TCL_EXE} ${TCL_ZIP_FILE} /tmp/macher_output; \ | | | 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 | ${CC} ${CFLAGS} ${LDFLAGS} ${TCLSH_OBJS} \ @TCL_BUILD_LIB_SPEC@ ${TCL_STUB_LIB_FILE} ${LIBS} @EXTRA_TCLSH_LIBS@ \ ${CC_SEARCH_FLAGS} -o ${TCL_EXE} @if test "${ZIPFS_BUILD}" = "2" ; then \ if test "x$(MACHER)" = "x" ; then \ cat ${TCL_ZIP_FILE} >> ${TCL_EXE}; \ else $(MACHER) append ${TCL_EXE} ${TCL_ZIP_FILE} /tmp/macher_output; \ mv /tmp/macher_output ${TCL_EXE}; chmod u+x ${TCL_EXE}; \ fi; \ ${NATIVE_ZIP} -A ${TCL_EXE} \ || echo 'ignore zip-error by adjust sfx process (not executable?)'; \ fi # Must be empty so it doesn't conflict with rule for ${TCL_EXE} above ${NATIVE_TCLSH}: |
︙ | ︙ | |||
896 897 898 899 900 901 902 | ${CC} ${CFLAGS} ${LDFLAGS} ${TCLTEST_OBJS} \ @TCL_BUILD_LIB_SPEC@ ${TCL_STUB_LIB_FILE} ${LIBS} @EXTRA_TCLSH_LIBS@ \ ${CC_SEARCH_FLAGS} -o ${TCLTEST_EXE} @if test "${ZIPFS_BUILD}" = "2" ; then \ if test "x$(MACHER)" = "x" ; then \ cat ${TCL_ZIP_FILE} >> ${TCLTEST_EXE}; \ else $(MACHER) append ${TCLTEST_EXE} ${TCL_ZIP_FILE} /tmp/macher_output; \ | | | 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 | ${CC} ${CFLAGS} ${LDFLAGS} ${TCLTEST_OBJS} \ @TCL_BUILD_LIB_SPEC@ ${TCL_STUB_LIB_FILE} ${LIBS} @EXTRA_TCLSH_LIBS@ \ ${CC_SEARCH_FLAGS} -o ${TCLTEST_EXE} @if test "${ZIPFS_BUILD}" = "2" ; then \ if test "x$(MACHER)" = "x" ; then \ cat ${TCL_ZIP_FILE} >> ${TCLTEST_EXE}; \ else $(MACHER) append ${TCLTEST_EXE} ${TCL_ZIP_FILE} /tmp/macher_output; \ mv /tmp/macher_output ${TCLTEST_EXE}; chmod u+x ${TCLTEST_EXE}; \ fi; \ ${NATIVE_ZIP} -A ${TCLTEST_EXE} \ || echo 'ignore zip-error by adjust sfx process (not executable?)'; \ fi # Note, in the targets below TCL_LIBRARY needs to be set or else "make test" # won't work in the case where the compilation directory isn't the same as the |
︙ | ︙ | |||
1069 1070 1071 1072 1073 1074 1075 | @echo "Installing library files to $(SCRIPT_INSTALL_DIR)/" @for i in $(TOP_DIR)/library/*.tcl $(TOP_DIR)/library/tclIndex \ $(UNIX_DIR)/tclAppInit.c @LDAIX_SRC@ @DTRACE_SRC@ ; do \ $(INSTALL_DATA) $$i "$(SCRIPT_INSTALL_DIR)"; \ done; @echo "Installing package cookiejar 0.2 files to $(SCRIPT_INSTALL_DIR)/cookiejar0.2/" @for i in $(TOP_DIR)/library/cookiejar/*.tcl \ | | | | | 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 | @echo "Installing library files to $(SCRIPT_INSTALL_DIR)/" @for i in $(TOP_DIR)/library/*.tcl $(TOP_DIR)/library/tclIndex \ $(UNIX_DIR)/tclAppInit.c @LDAIX_SRC@ @DTRACE_SRC@ ; do \ $(INSTALL_DATA) $$i "$(SCRIPT_INSTALL_DIR)"; \ done; @echo "Installing package cookiejar 0.2 files to $(SCRIPT_INSTALL_DIR)/cookiejar0.2/" @for i in $(TOP_DIR)/library/cookiejar/*.tcl \ $(TOP_DIR)/library/cookiejar/*.gz; \ do \ $(INSTALL_DATA) $$i "$(SCRIPT_INSTALL_DIR)/cookiejar0.2"; \ done @echo "Installing package http 2.10b4 as a Tcl Module" @$(INSTALL_DATA) $(TOP_DIR)/library/http/http.tcl \ "$(MODULE_INSTALL_DIR)/9.0/http-2.10b4.tm" @echo "Installing package opt0.4 files to $(SCRIPT_INSTALL_DIR)/opt0.4/" @for i in $(TOP_DIR)/library/opt/*.tcl; do \ $(INSTALL_DATA) $$i "$(SCRIPT_INSTALL_DIR)/opt0.4"; \ done @echo "Installing package msgcat 1.7.1 as a Tcl Module" @$(INSTALL_DATA) $(TOP_DIR)/library/msgcat/msgcat.tcl \ "$(MODULE_INSTALL_DIR)/9.0/msgcat-1.7.1.tm" |
︙ | ︙ | |||
1099 1100 1101 1102 1103 1104 1105 | @echo "Installing encoding files to $(SCRIPT_INSTALL_DIR)/encoding/" @for i in $(TOP_DIR)/library/encoding/*.enc; do \ $(INSTALL_DATA) $$i "$(SCRIPT_INSTALL_DIR)/encoding"; \ done @if [ -n "$(TCL_MODULE_PATH)" -a -f $(TOP_DIR)/library/tm.tcl ] ; then \ echo "Customizing tcl module path"; \ echo "if {![interp issafe]} { ::tcl::tm::roots [list $(TCL_MODULE_PATH)] }" >> \ | | | 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 | @echo "Installing encoding files to $(SCRIPT_INSTALL_DIR)/encoding/" @for i in $(TOP_DIR)/library/encoding/*.enc; do \ $(INSTALL_DATA) $$i "$(SCRIPT_INSTALL_DIR)/encoding"; \ done @if [ -n "$(TCL_MODULE_PATH)" -a -f $(TOP_DIR)/library/tm.tcl ] ; then \ echo "Customizing tcl module path"; \ echo "if {![interp issafe]} { ::tcl::tm::roots [list $(TCL_MODULE_PATH)] }" >> \ "$(SCRIPT_INSTALL_DIR)/tm.tcl"; \ fi install-tzdata: @for i in tzdata; do \ if [ ! -d "$(SCRIPT_INSTALL_DIR)/$$i" ] ; then \ echo "Making directory $(SCRIPT_INSTALL_DIR)/$$i"; \ $(INSTALL_DATA_DIR) "$(SCRIPT_INSTALL_DIR)/$$i"; \ |
︙ | ︙ | |||
1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 | tclOOInfo.o: $(GENERIC_DIR)/tclOOInfo.c $(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclOOInfo.c tclOOMethod.o: $(GENERIC_DIR)/tclOOMethod.c $(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclOOMethod.c tclOOStubInit.o: $(GENERIC_DIR)/tclOOStubInit.c $(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclOOStubInit.c tclParse.o: $(GENERIC_DIR)/tclParse.c $(PARSEHDR) $(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclParse.c tclPanic.o: $(GENERIC_DIR)/tclPanic.c | > > > | 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 | tclOOInfo.o: $(GENERIC_DIR)/tclOOInfo.c $(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclOOInfo.c tclOOMethod.o: $(GENERIC_DIR)/tclOOMethod.c $(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclOOMethod.c tclOOProp.o: $(GENERIC_DIR)/tclOOProp.c $(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclOOProp.c tclOOStubInit.o: $(GENERIC_DIR)/tclOOStubInit.c $(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclOOStubInit.c tclParse.o: $(GENERIC_DIR)/tclParse.c $(PARSEHDR) $(CC) -c $(CC_SWITCHES) $(GENERIC_DIR)/tclParse.c tclPanic.o: $(GENERIC_DIR)/tclPanic.c |
︙ | ︙ |
Changes to unix/configure.
︙ | ︙ | |||
2706 2707 2708 2709 2710 2711 2712 | TCL_VERSION=9.0 TCL_MAJOR_VERSION=9 TCL_MINOR_VERSION=0 | | | 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 | TCL_VERSION=9.0 TCL_MAJOR_VERSION=9 TCL_MINOR_VERSION=0 TCL_PATCH_LEVEL="b4" VERSION=${TCL_VERSION} EXTRA_INSTALL_BINARIES=${EXTRA_INSTALL_BINARIES:-"@:"} EXTRA_BUILD_HTML=${EXTRA_BUILD_HTML:-"@:"} #------------------------------------------------------------------------ # Setup configure arguments for bundled packages |
︙ | ︙ | |||
6366 6367 6368 6369 6370 6371 6372 | fi # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = yes then : | | | | | | | | | 6366 6367 6368 6369 6370 6371 6372 6373 6374 6375 6376 6377 6378 6379 6380 6381 6382 6383 6384 6385 6386 6387 6388 6389 6390 6391 6392 | fi # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = yes then : if test "$GCC" = yes then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported by gcc" >&5 printf "%s\n" "$as_me: WARNING: 64bit mode not supported by gcc" >&2;} else case e in #( e) do64bit_ok=yes SHLIB_LD="ld -64 -shared -rdata_shared" CFLAGS="$CFLAGS -64" LDFLAGS_ARCH="-64" ;; esac fi fi ;; Linux*|GNU*|NetBSD-Debian|DragonFly-*|FreeBSD-*) SHLIB_CFLAGS="-fPIC -fno-common" |
︙ | ︙ | |||
6863 6864 6865 6866 6867 6868 6869 | rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test "$fat_32_64" = yes then : for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' | | | 6863 6864 6865 6866 6867 6868 6869 6870 6871 6872 6873 6874 6875 6876 6877 | rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test "$fat_32_64" = yes then : for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done fi LIBS=$hold_libs ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_lib_corefoundation" >&5 printf "%s\n" "$tcl_cv_lib_corefoundation" >&6; } if test $tcl_cv_lib_corefoundation = yes |
︙ | ︙ | |||
6928 6929 6930 6931 6932 6933 6934 | printf "%s\n" "$tcl_cv_lib_corefoundation_64" >&6; } if test $tcl_cv_lib_corefoundation_64 = no then : printf "%s\n" "#define NO_COREFOUNDATION_64 1" >>confdefs.h | | | | | 6928 6929 6930 6931 6932 6933 6934 6935 6936 6937 6938 6939 6940 6941 6942 6943 6944 6945 6946 6947 6948 6949 6950 6951 6952 6953 6954 6955 6956 6957 6958 6959 6960 6961 6962 6963 6964 6965 6966 6967 | printf "%s\n" "$tcl_cv_lib_corefoundation_64" >&6; } if test $tcl_cv_lib_corefoundation_64 = no then : printf "%s\n" "#define NO_COREFOUNDATION_64 1" >>confdefs.h LDFLAGS="$LDFLAGS -Wl,-no_arch_warnings" fi fi fi ;; OS/390-*) SHLIB_LD_LIBS="" CFLAGS_OPTIMIZE="" # Optimizer is buggy printf "%s\n" "#define _OE_SOCKETS 1" >>confdefs.h ;; OSF1-V*) # Digital OSF/1 SHLIB_CFLAGS="" if test "$SHARED_BUILD" = 1 then : SHLIB_LD='${CC} -shared' else case e in #( e) SHLIB_LD='${CC} -non_shared' ;; esac fi SHLIB_SUFFIX=".so" DL_OBJS="tclLoadDl.o" DL_LIBS="" if test $doRpath = yes |
︙ | ︙ | |||
7296 7297 7298 7299 7300 7301 7302 | tcl_cv_ld_Bexport=yes else case e in #( e) tcl_cv_ld_Bexport=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext | | | 7296 7297 7298 7299 7300 7301 7302 7303 7304 7305 7306 7307 7308 7309 7310 | tcl_cv_ld_Bexport=yes else case e in #( e) tcl_cv_ld_Bexport=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$hold_ldflags ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_ld_Bexport" >&5 printf "%s\n" "$tcl_cv_ld_Bexport" >&6; } if test $tcl_cv_ld_Bexport = yes then : |
︙ | ︙ | |||
7414 7415 7416 7417 7418 7419 7420 | UNSHARED_LIB_SUFFIX='${VERSION}.a' fi DLL_INSTALL_DIR="\$(LIB_INSTALL_DIR)" if test "${SHARED_BUILD}" = 1 -a "${SHLIB_SUFFIX}" != "" then : | | | | | | | | | | | | | | | | | | 7414 7415 7416 7417 7418 7419 7420 7421 7422 7423 7424 7425 7426 7427 7428 7429 7430 7431 7432 7433 7434 7435 7436 7437 7438 7439 7440 7441 7442 7443 7444 7445 7446 7447 7448 7449 7450 7451 7452 7453 7454 7455 7456 7457 7458 7459 7460 7461 7462 7463 7464 7465 7466 7467 7468 7469 7470 7471 7472 7473 7474 7475 7476 7477 7478 7479 7480 7481 7482 7483 | UNSHARED_LIB_SUFFIX='${VERSION}.a' fi DLL_INSTALL_DIR="\$(LIB_INSTALL_DIR)" if test "${SHARED_BUILD}" = 1 -a "${SHLIB_SUFFIX}" != "" then : LIB_SUFFIX=${SHARED_LIB_SUFFIX} MAKE_LIB='${SHLIB_LD} -o $@ ${OBJS} ${LDFLAGS} ${SHLIB_LD_LIBS} ${TCL_SHLIB_LD_EXTRAS} ${TK_SHLIB_LD_EXTRAS} ${LD_SEARCH_FLAGS}' if test "${SHLIB_SUFFIX}" = ".dll" then : INSTALL_LIB='$(INSTALL_LIBRARY) $(LIB_FILE) "$(BIN_INSTALL_DIR)/$(LIB_FILE)"' DLL_INSTALL_DIR="\$(BIN_INSTALL_DIR)" else case e in #( e) INSTALL_LIB='$(INSTALL_LIBRARY) $(LIB_FILE) "$(LIB_INSTALL_DIR)/$(LIB_FILE)"' ;; esac fi else case e in #( e) LIB_SUFFIX=${UNSHARED_LIB_SUFFIX} if test "$RANLIB" = "" then : MAKE_LIB='$(STLIB_LD) $@ ${OBJS}' else case e in #( e) MAKE_LIB='${STLIB_LD} $@ ${OBJS} ; ${RANLIB} $@' ;; esac fi INSTALL_LIB='$(INSTALL_LIBRARY) $(LIB_FILE) "$(LIB_INSTALL_DIR)/$(LIB_FILE)"' ;; esac fi # Stub lib does not depend on shared/static configuration if test "$RANLIB" = "" then : MAKE_STUB_LIB='${STLIB_LD} $@ ${STUB_LIB_OBJS}' else case e in #( e) MAKE_STUB_LIB='${STLIB_LD} $@ ${STUB_LIB_OBJS} ; ${RANLIB} $@' ;; esac fi INSTALL_STUB_LIB='$(INSTALL_LIBRARY) $(STUB_LIB_FILE) "$(LIB_INSTALL_DIR)/$(STUB_LIB_FILE)"' # Define TCL_LIBS now that we know what DL_LIBS is. # The trick here is that we don't want to change the value of TCL_LIBS if # it is already set when tclConfig.sh had been loaded by Tk. if test "x${TCL_LIBS}" = x then : TCL_LIBS="${DL_LIBS} ${LIBS} ${MATH_LIBS}" fi # See if the compiler supports casting to a union type. # This is used to stop gcc from printing a compiler # warning when initializing a union member. |
︙ | ︙ | |||
7917 7918 7919 7920 7921 7922 7923 | printf %s "(cached) " >&6 else case e in #( e) tcl_cv_type_64bit=none # See if we could use long anyway Note that we substitute in the # type that is our current guess for a 64-bit type inside this check # program, so it should be modified only carefully... | | | | | 7917 7918 7919 7920 7921 7922 7923 7924 7925 7926 7927 7928 7929 7930 7931 7932 7933 7934 7935 7936 7937 7938 7939 | printf %s "(cached) " >&6 else case e in #( e) tcl_cv_type_64bit=none # See if we could use long anyway Note that we substitute in the # type that is our current guess for a 64-bit type inside this check # program, so it should be modified only carefully... cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { switch (0) { case 1: case (sizeof(long long)==sizeof(long)): ; } ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : tcl_cv_type_64bit="long long" |
︙ | ︙ | |||
8071 8072 8073 8074 8075 8076 8077 | /* end confdefs.h. */ #include <sys/types.h> #include <dirent.h> int main (void) { struct dirent64 *p; DIR64 d = opendir64("."); | | | 8071 8072 8073 8074 8075 8076 8077 8078 8079 8080 8081 8082 8083 8084 8085 | /* end confdefs.h. */ #include <sys/types.h> #include <dirent.h> int main (void) { struct dirent64 *p; DIR64 d = opendir64("."); p = readdir64(d); rewinddir64(d); closedir64(d); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : tcl_cv_DIR64=yes |
︙ | ︙ | |||
8138 8139 8140 8141 8142 8143 8144 | esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi if test "x${tcl_cv_type_off64_t}" = "xyes" && \ | | | | 8138 8139 8140 8141 8142 8143 8144 8145 8146 8147 8148 8149 8150 8151 8152 8153 | esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi if test "x${tcl_cv_type_off64_t}" = "xyes" && \ test "x${ac_cv_func_lseek64}" = "xyes" && \ test "x${ac_cv_func_open64}" = "xyes" ; then printf "%s\n" "#define HAVE_TYPE_OFF64_T 1" >>confdefs.h { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 |
︙ | ︙ | |||
11198 11199 11200 11201 11202 11203 11204 | if test "$tcl_ok" = "yes" -a "x$enable_framework" != "xyes"; then # # Find a native compiler # # Put a plausible default for CC_FOR_BUILD in Makefile. if test -z "$CC_FOR_BUILD"; then if test "x$cross_compiling" = "xno"; then | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 11198 11199 11200 11201 11202 11203 11204 11205 11206 11207 11208 11209 11210 11211 11212 11213 11214 11215 11216 11217 11218 11219 11220 11221 11222 11223 11224 11225 11226 11227 11228 11229 11230 11231 11232 11233 11234 11235 11236 11237 11238 11239 11240 11241 11242 11243 11244 11245 11246 11247 11248 11249 11250 11251 11252 11253 11254 11255 11256 11257 11258 11259 11260 11261 11262 11263 | if test "$tcl_ok" = "yes" -a "x$enable_framework" != "xyes"; then # # Find a native compiler # # Put a plausible default for CC_FOR_BUILD in Makefile. if test -z "$CC_FOR_BUILD"; then if test "x$cross_compiling" = "xno"; then CC_FOR_BUILD='$(CC)' else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gcc" >&5 printf %s "checking for gcc... " >&6; } if test ${ac_cv_path_cc+y} then : printf %s "(cached) " >&6 else case e in #( e) search_path=`echo ${PATH} | sed -e 's/:/ /g'` for dir in $search_path ; do for j in `ls -r $dir/gcc 2> /dev/null` \ `ls -r $dir/gcc 2> /dev/null` ; do if test x"$ac_cv_path_cc" = x ; then if test -f "$j" ; then ac_cv_path_cc=$j break fi fi done done ;; esac fi fi fi # Also set EXEEXT_FOR_BUILD. if test "x$cross_compiling" = "xno"; then EXEEXT_FOR_BUILD='$(EXEEXT)' OBJEXT_FOR_BUILD='$(OBJEXT)' else OBJEXT_FOR_BUILD='.no' { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for build system executable suffix" >&5 printf %s "checking for build system executable suffix... " >&6; } if test ${bfd_cv_build_exeext+y} then : printf %s "(cached) " >&6 else case e in #( e) rm -f conftest* echo 'int main () { return 0; }' > conftest.c bfd_cv_build_exeext= ${CC_FOR_BUILD} -o conftest conftest.c 1>&5 2>&5 for file in conftest.*; do case $file in *.c | *.o | *.obj | *.ilk | *.pdb) ;; *) bfd_cv_build_exeext=`echo $file | sed -e s/conftest//` ;; esac done rm -f conftest* test x"${bfd_cv_build_exeext}" = x && bfd_cv_build_exeext=no ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bfd_cv_build_exeext" >&5 printf "%s\n" "$bfd_cv_build_exeext" >&6; } EXEEXT_FOR_BUILD="" test x"${bfd_cv_build_exeext}" != xno && EXEEXT_FOR_BUILD=${bfd_cv_build_exeext} fi |
︙ | ︙ | |||
11277 11278 11279 11280 11281 11282 11283 | if test ${ac_cv_path_macher+y} then : printf %s "(cached) " >&6 else case e in #( e) search_path=`echo ${PATH} | sed -e 's/:/ /g'` for dir in $search_path ; do | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 11277 11278 11279 11280 11281 11282 11283 11284 11285 11286 11287 11288 11289 11290 11291 11292 11293 11294 11295 11296 11297 11298 11299 11300 11301 11302 11303 11304 11305 11306 11307 11308 11309 11310 11311 11312 11313 11314 11315 11316 11317 11318 11319 11320 11321 11322 11323 11324 11325 11326 11327 11328 11329 11330 11331 11332 11333 11334 11335 11336 11337 11338 11339 11340 11341 11342 11343 11344 11345 11346 11347 11348 11349 11350 11351 | if test ${ac_cv_path_macher+y} then : printf %s "(cached) " >&6 else case e in #( e) search_path=`echo ${PATH} | sed -e 's/:/ /g'` for dir in $search_path ; do for j in `ls -r $dir/macher 2> /dev/null` \ `ls -r $dir/macher 2> /dev/null` ; do if test x"$ac_cv_path_macher" = x ; then if test -f "$j" ; then ac_cv_path_macher=$j break fi fi done done ;; esac fi if test -f "$ac_cv_path_macher" ; then MACHER_PROG="$ac_cv_path_macher" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MACHER_PROG" >&5 printf "%s\n" "$MACHER_PROG" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: Found macher in environment" >&5 printf "%s\n" "Found macher in environment" >&6; } fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for zip" >&5 printf %s "checking for zip... " >&6; } if test ${ac_cv_path_zip+y} then : printf %s "(cached) " >&6 else case e in #( e) search_path=`echo ${PATH} | sed -e 's/:/ /g'` for dir in $search_path ; do for j in `ls -r $dir/zip 2> /dev/null` \ `ls -r $dir/zip 2> /dev/null` ; do if test x"$ac_cv_path_zip" = x ; then if test -f "$j" ; then ac_cv_path_zip=$j break fi fi done done ;; esac fi if test -f "$ac_cv_path_zip" ; then ZIP_PROG="$ac_cv_path_zip" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ZIP_PROG" >&5 printf "%s\n" "$ZIP_PROG" >&6; } ZIP_PROG_OPTIONS="-rq" ZIP_PROG_VFSSEARCH="*" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: Found INFO Zip in environment" >&5 printf "%s\n" "Found INFO Zip in environment" >&6; } # Use standard arguments for zip else # It is not an error if an installed version of Zip can't be located. # We can use the locally distributed minizip instead ZIP_PROG="./minizip${EXEEXT_FOR_BUILD}" ZIP_PROG_OPTIONS="-o -r" ZIP_PROG_VFSSEARCH="*" ZIP_INSTALL_OBJS="minizip${EXEEXT_FOR_BUILD}" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: No zip found on PATH. Building minizip" >&5 printf "%s\n" "No zip found on PATH. Building minizip" >&6; } fi |
︙ | ︙ | |||
11396 11397 11398 11399 11400 11401 11402 11403 11404 11405 11406 11407 11408 11409 | # consists of one directory for machine-dependent binaries and # another for platform-independent scripts. #-------------------------------------------------------------------- if test "$FRAMEWORK_BUILD" = "1" ; then test -z "$TCL_PACKAGE_PATH" && \ TCL_PACKAGE_PATH="~/Library/Tcl:/Library/Tcl:~/Library/Frameworks:/Library/Frameworks" test -z "$TCL_MODULE_PATH" && \ TCL_MODULE_PATH="~/Library/Tcl /Library/Tcl" elif test "$prefix/lib" != "$libdir"; then test -z "$TCL_PACKAGE_PATH" && TCL_PACKAGE_PATH="${libdir}:${prefix}/lib" else test -z "$TCL_PACKAGE_PATH" && TCL_PACKAGE_PATH="${prefix}/lib" fi | > > | 11396 11397 11398 11399 11400 11401 11402 11403 11404 11405 11406 11407 11408 11409 11410 11411 | # consists of one directory for machine-dependent binaries and # another for platform-independent scripts. #-------------------------------------------------------------------- if test "$FRAMEWORK_BUILD" = "1" ; then test -z "$TCL_PACKAGE_PATH" && \ TCL_PACKAGE_PATH="~/Library/Tcl:/Library/Tcl:~/Library/Frameworks:/Library/Frameworks" # Allow tclsh to find Tk when multiple versions are installed. See Tk [1562e10c58]. TCL_PACKAGE_PATH="$TCL_PACKAGE_PATH:/Library/Frameworks/Tk.framework/Versions" test -z "$TCL_MODULE_PATH" && \ TCL_MODULE_PATH="~/Library/Tcl /Library/Tcl" elif test "$prefix/lib" != "$libdir"; then test -z "$TCL_PACKAGE_PATH" && TCL_PACKAGE_PATH="${libdir}:${prefix}/lib" else test -z "$TCL_PACKAGE_PATH" && TCL_PACKAGE_PATH="${prefix}/lib" fi |
︙ | ︙ |
Changes to unix/configure.ac.
︙ | ︙ | |||
22 23 24 25 26 27 28 | /* override */ #undef PACKAGE_STRING #endif /* _TCLCONFIG */]) ]) TCL_VERSION=9.0 TCL_MAJOR_VERSION=9 TCL_MINOR_VERSION=0 | | | 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | /* override */ #undef PACKAGE_STRING #endif /* _TCLCONFIG */]) ]) TCL_VERSION=9.0 TCL_MAJOR_VERSION=9 TCL_MINOR_VERSION=0 TCL_PATCH_LEVEL="b4" VERSION=${TCL_VERSION} EXTRA_INSTALL_BINARIES=${EXTRA_INSTALL_BINARIES:-"@:"} EXTRA_BUILD_HTML=${EXTRA_BUILD_HTML:-"@:"} #------------------------------------------------------------------------ # Setup configure arguments for bundled packages |
︙ | ︙ | |||
887 888 889 890 891 892 893 894 895 896 897 898 899 900 | # consists of one directory for machine-dependent binaries and # another for platform-independent scripts. #-------------------------------------------------------------------- if test "$FRAMEWORK_BUILD" = "1" ; then test -z "$TCL_PACKAGE_PATH" && \ TCL_PACKAGE_PATH="~/Library/Tcl:/Library/Tcl:~/Library/Frameworks:/Library/Frameworks" test -z "$TCL_MODULE_PATH" && \ TCL_MODULE_PATH="~/Library/Tcl /Library/Tcl" elif test "$prefix/lib" != "$libdir"; then test -z "$TCL_PACKAGE_PATH" && TCL_PACKAGE_PATH="${libdir}:${prefix}/lib" else test -z "$TCL_PACKAGE_PATH" && TCL_PACKAGE_PATH="${prefix}/lib" fi | > > | 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 | # consists of one directory for machine-dependent binaries and # another for platform-independent scripts. #-------------------------------------------------------------------- if test "$FRAMEWORK_BUILD" = "1" ; then test -z "$TCL_PACKAGE_PATH" && \ TCL_PACKAGE_PATH="~/Library/Tcl:/Library/Tcl:~/Library/Frameworks:/Library/Frameworks" # Allow tclsh to find Tk when multiple versions are installed. See Tk [1562e10c58]. TCL_PACKAGE_PATH="$TCL_PACKAGE_PATH:/Library/Frameworks/Tk.framework/Versions" test -z "$TCL_MODULE_PATH" && \ TCL_MODULE_PATH="~/Library/Tcl /Library/Tcl" elif test "$prefix/lib" != "$libdir"; then test -z "$TCL_PACKAGE_PATH" && TCL_PACKAGE_PATH="${libdir}:${prefix}/lib" else test -z "$TCL_PACKAGE_PATH" && TCL_PACKAGE_PATH="${prefix}/lib" fi |
︙ | ︙ |
Changes to unix/tcl.m4.
︙ | ︙ | |||
283 284 285 286 287 288 289 | # TCL_LIB_FILE #------------------------------------------------------------------------ AC_DEFUN([SC_LOAD_TCLCONFIG], [ AC_MSG_CHECKING([for existence of ${TCL_BIN_DIR}/tclConfig.sh]) if test -f "${TCL_BIN_DIR}/tclConfig.sh" ; then | | | | | | | 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 | # TCL_LIB_FILE #------------------------------------------------------------------------ AC_DEFUN([SC_LOAD_TCLCONFIG], [ AC_MSG_CHECKING([for existence of ${TCL_BIN_DIR}/tclConfig.sh]) if test -f "${TCL_BIN_DIR}/tclConfig.sh" ; then AC_MSG_RESULT([loading]) . "${TCL_BIN_DIR}/tclConfig.sh" else AC_MSG_RESULT([could not find ${TCL_BIN_DIR}/tclConfig.sh]) fi # If the TCL_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TCL_LIB_SPEC will be set to the value # of TCL_BUILD_LIB_SPEC. An extension should make use of TCL_LIB_SPEC # instead of TCL_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TCL_BIN_DIR}/Makefile" ; then TCL_LIB_SPEC="${TCL_BUILD_LIB_SPEC}" TCL_STUB_LIB_SPEC="${TCL_BUILD_STUB_LIB_SPEC}" TCL_STUB_LIB_PATH="${TCL_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tcl.framework installed in an arbitrary location. case ${TCL_DEFS} in *TCL_FRAMEWORK*) if test -f "${TCL_BIN_DIR}/${TCL_LIB_FILE}"; then |
︙ | ︙ | |||
356 357 358 359 360 361 362 | # TK_BIN_DIR #------------------------------------------------------------------------ AC_DEFUN([SC_LOAD_TKCONFIG], [ AC_MSG_CHECKING([for existence of ${TK_BIN_DIR}/tkConfig.sh]) if test -f "${TK_BIN_DIR}/tkConfig.sh" ; then | | | | | | | 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 | # TK_BIN_DIR #------------------------------------------------------------------------ AC_DEFUN([SC_LOAD_TKCONFIG], [ AC_MSG_CHECKING([for existence of ${TK_BIN_DIR}/tkConfig.sh]) if test -f "${TK_BIN_DIR}/tkConfig.sh" ; then AC_MSG_RESULT([loading]) . "${TK_BIN_DIR}/tkConfig.sh" else AC_MSG_RESULT([could not find ${TK_BIN_DIR}/tkConfig.sh]) fi # If the TK_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TK_LIB_SPEC will be set to the value # of TK_BUILD_LIB_SPEC. An extension should make use of TK_LIB_SPEC # instead of TK_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TK_BIN_DIR}/Makefile" ; then TK_LIB_SPEC="${TK_BUILD_LIB_SPEC}" TK_STUB_LIB_SPEC="${TK_BUILD_STUB_LIB_SPEC}" TK_STUB_LIB_PATH="${TK_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tk.framework installed in an arbitrary location. case ${TK_DEFS} in *TK_FRAMEWORK*) if test -f "${TK_BIN_DIR}/${TK_LIB_FILE}"; then |
︙ | ︙ | |||
1245 1246 1247 1248 1249 1250 1251 | AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='"-Wl,-rpath,${LIB_RUNTIME_DIR}"' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = yes], [ | | | | | | | | | | 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 | AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='"-Wl,-rpath,${LIB_RUNTIME_DIR}"' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = yes], [ AS_IF([test "$GCC" = yes], [ AC_MSG_WARN([64bit mode not supported by gcc]) ], [ do64bit_ok=yes SHLIB_LD="ld -64 -shared -rdata_shared" CFLAGS="$CFLAGS -64" LDFLAGS_ARCH="-64" ]) ]) ;; Linux*|GNU*|NetBSD-Debian|DragonFly-*|FreeBSD-*) SHLIB_CFLAGS="-fPIC -fno-common" SHLIB_SUFFIX=".so" CFLAGS_OPTIMIZE="-O2" |
︙ | ︙ | |||
1481 1482 1483 1484 1485 1486 1487 | AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <CoreFoundation/CoreFoundation.h>]], [[CFBundleRef b = CFBundleGetMainBundle();]])], [tcl_cv_lib_corefoundation=yes], [tcl_cv_lib_corefoundation=no]) AS_IF([test "$fat_32_64" = yes], [ for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' | | | 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 | AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <CoreFoundation/CoreFoundation.h>]], [[CFBundleRef b = CFBundleGetMainBundle();]])], [tcl_cv_lib_corefoundation=yes], [tcl_cv_lib_corefoundation=no]) AS_IF([test "$fat_32_64" = yes], [ for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done]) LIBS=$hold_libs]) AS_IF([test $tcl_cv_lib_corefoundation = yes], [ LIBS="$LIBS -framework CoreFoundation" AC_DEFINE(HAVE_COREFOUNDATION, 1, [Do we have access to Darwin CoreFoundation.framework?]) ], [tcl_corefoundation=no]) AS_IF([test "$fat_32_64" = yes -a $tcl_corefoundation = yes],[ |
︙ | ︙ | |||
1504 1505 1506 1507 1508 1509 1510 | [tcl_cv_lib_corefoundation_64=no]) for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done]) AS_IF([test $tcl_cv_lib_corefoundation_64 = no], [ AC_DEFINE(NO_COREFOUNDATION_64, 1, [Is Darwin CoreFoundation unavailable for 64-bit?]) | | | | | 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 | [tcl_cv_lib_corefoundation_64=no]) for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done]) AS_IF([test $tcl_cv_lib_corefoundation_64 = no], [ AC_DEFINE(NO_COREFOUNDATION_64, 1, [Is Darwin CoreFoundation unavailable for 64-bit?]) LDFLAGS="$LDFLAGS -Wl,-no_arch_warnings" ]) ]) ]) ;; OS/390-*) SHLIB_LD_LIBS="" CFLAGS_OPTIMIZE="" # Optimizer is buggy AC_DEFINE(_OE_SOCKETS, 1, # needed in sys/socket.h [Should OS/390 do the right thing with sockets?]) ;; OSF1-V*) # Digital OSF/1 SHLIB_CFLAGS="" AS_IF([test "$SHARED_BUILD" = 1], [ SHLIB_LD='${CC} -shared' ], [ SHLIB_LD='${CC} -non_shared' ]) SHLIB_SUFFIX=".so" DL_OBJS="tclLoadDl.o" DL_LIBS="" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='"-Wl,-rpath,${LIB_RUNTIME_DIR}"' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) |
︙ | ︙ | |||
1718 1719 1720 1721 1722 1723 1724 | DL_LIBS="-ldl" # Some UNIX_SV* systems (unixware 1.1.2 for example) have linkers # that don't grok the -Bexport option. Test that it does. AC_CACHE_CHECK([for ld accepts -Bexport flag], tcl_cv_ld_Bexport, [ hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-Bexport" AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[int i;]])],[tcl_cv_ld_Bexport=yes],[tcl_cv_ld_Bexport=no]) | | | 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 | DL_LIBS="-ldl" # Some UNIX_SV* systems (unixware 1.1.2 for example) have linkers # that don't grok the -Bexport option. Test that it does. AC_CACHE_CHECK([for ld accepts -Bexport flag], tcl_cv_ld_Bexport, [ hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-Bexport" AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[int i;]])],[tcl_cv_ld_Bexport=yes],[tcl_cv_ld_Bexport=no]) LDFLAGS=$hold_ldflags]) AS_IF([test $tcl_cv_ld_Bexport = yes], [ LDFLAGS="$LDFLAGS -Wl,-Bexport" ]) CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; esac |
︙ | ︙ | |||
1794 1795 1796 1797 1798 1799 1800 | AS_IF([test "$SHARED_LIB_SUFFIX" = ""], [ SHARED_LIB_SUFFIX='${VERSION}${SHLIB_SUFFIX}']) AS_IF([test "$UNSHARED_LIB_SUFFIX" = ""], [ UNSHARED_LIB_SUFFIX='${VERSION}.a']) DLL_INSTALL_DIR="\$(LIB_INSTALL_DIR)" AS_IF([test "${SHARED_BUILD}" = 1 -a "${SHLIB_SUFFIX}" != ""], [ | | | | | | | | | | | | | | | | | | | | 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 | AS_IF([test "$SHARED_LIB_SUFFIX" = ""], [ SHARED_LIB_SUFFIX='${VERSION}${SHLIB_SUFFIX}']) AS_IF([test "$UNSHARED_LIB_SUFFIX" = ""], [ UNSHARED_LIB_SUFFIX='${VERSION}.a']) DLL_INSTALL_DIR="\$(LIB_INSTALL_DIR)" AS_IF([test "${SHARED_BUILD}" = 1 -a "${SHLIB_SUFFIX}" != ""], [ LIB_SUFFIX=${SHARED_LIB_SUFFIX} MAKE_LIB='${SHLIB_LD} -o [$]@ ${OBJS} ${LDFLAGS} ${SHLIB_LD_LIBS} ${TCL_SHLIB_LD_EXTRAS} ${TK_SHLIB_LD_EXTRAS} ${LD_SEARCH_FLAGS}' AS_IF([test "${SHLIB_SUFFIX}" = ".dll"], [ INSTALL_LIB='$(INSTALL_LIBRARY) $(LIB_FILE) "$(BIN_INSTALL_DIR)/$(LIB_FILE)"' DLL_INSTALL_DIR="\$(BIN_INSTALL_DIR)" ], [ INSTALL_LIB='$(INSTALL_LIBRARY) $(LIB_FILE) "$(LIB_INSTALL_DIR)/$(LIB_FILE)"' ]) ], [ LIB_SUFFIX=${UNSHARED_LIB_SUFFIX} AS_IF([test "$RANLIB" = ""], [ MAKE_LIB='$(STLIB_LD) [$]@ ${OBJS}' ], [ MAKE_LIB='${STLIB_LD} [$]@ ${OBJS} ; ${RANLIB} [$]@' ]) INSTALL_LIB='$(INSTALL_LIBRARY) $(LIB_FILE) "$(LIB_INSTALL_DIR)/$(LIB_FILE)"' ]) # Stub lib does not depend on shared/static configuration AS_IF([test "$RANLIB" = ""], [ MAKE_STUB_LIB='${STLIB_LD} [$]@ ${STUB_LIB_OBJS}' ], [ MAKE_STUB_LIB='${STLIB_LD} [$]@ ${STUB_LIB_OBJS} ; ${RANLIB} [$]@' ]) INSTALL_STUB_LIB='$(INSTALL_LIBRARY) $(STUB_LIB_FILE) "$(LIB_INSTALL_DIR)/$(STUB_LIB_FILE)"' # Define TCL_LIBS now that we know what DL_LIBS is. # The trick here is that we don't want to change the value of TCL_LIBS if # it is already set when tclConfig.sh had been loaded by Tk. AS_IF([test "x${TCL_LIBS}" = x], [ TCL_LIBS="${DL_LIBS} ${LIBS} ${MATH_LIBS}"]) AC_SUBST(TCL_LIBS) # See if the compiler supports casting to a union type. # This is used to stop gcc from printing a compiler # warning when initializing a union member. AC_CACHE_CHECK(for cast to union support, |
︙ | ︙ | |||
2348 2349 2350 2351 2352 2353 2354 | AC_DEFUN([SC_TCL_64BIT_FLAGS], [ AC_MSG_CHECKING([if 'long' and 'long long' have the same size (64-bit)?]) AC_CACHE_VAL(tcl_cv_type_64bit,[ tcl_cv_type_64bit=none # See if we could use long anyway Note that we substitute in the # type that is our current guess for a 64-bit type inside this check # program, so it should be modified only carefully... | | | | | 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 | AC_DEFUN([SC_TCL_64BIT_FLAGS], [ AC_MSG_CHECKING([if 'long' and 'long long' have the same size (64-bit)?]) AC_CACHE_VAL(tcl_cv_type_64bit,[ tcl_cv_type_64bit=none # See if we could use long anyway Note that we substitute in the # type that is our current guess for a 64-bit type inside this check # program, so it should be modified only carefully... AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[switch (0) { case 1: case (sizeof(long long)==sizeof(long)): ; }]])],[tcl_cv_type_64bit="long long"],[])]) if test "${tcl_cv_type_64bit}" = none ; then AC_DEFINE(TCL_WIDE_INT_IS_LONG, 1, [Do 'long' and 'long long' have the same size (64-bit)?]) AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) # Now check for auxiliary declarations AC_CACHE_CHECK([for 64-bit time_t], tcl_cv_time_t_64,[ |
︙ | ︙ | |||
2385 2386 2387 2388 2389 2390 2391 | if test "x${tcl_cv_struct_dirent64}" = "xyes" ; then AC_DEFINE(HAVE_STRUCT_DIRENT64, 1, [Is 'struct dirent64' in <sys/types.h>?]) fi AC_CACHE_CHECK([for DIR64], tcl_cv_DIR64,[ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h> #include <dirent.h>]], [[struct dirent64 *p; DIR64 d = opendir64("."); | | | | | 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 | if test "x${tcl_cv_struct_dirent64}" = "xyes" ; then AC_DEFINE(HAVE_STRUCT_DIRENT64, 1, [Is 'struct dirent64' in <sys/types.h>?]) fi AC_CACHE_CHECK([for DIR64], tcl_cv_DIR64,[ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h> #include <dirent.h>]], [[struct dirent64 *p; DIR64 d = opendir64("."); p = readdir64(d); rewinddir64(d); closedir64(d);]])], [tcl_cv_DIR64=yes], [tcl_cv_DIR64=no])]) if test "x${tcl_cv_DIR64}" = "xyes" ; then AC_DEFINE(HAVE_DIR64, 1, [Is 'DIR64' in <sys/types.h>?]) fi AC_CHECK_FUNCS(open64 lseek64) AC_MSG_CHECKING([for off64_t]) AC_CACHE_VAL(tcl_cv_type_off64_t,[ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>]], [[off64_t offset; ]])], [tcl_cv_type_off64_t=yes], [tcl_cv_type_off64_t=no])]) dnl Define HAVE_TYPE_OFF64_T only when the off64_t type and the dnl functions lseek64 and open64 are defined. if test "x${tcl_cv_type_off64_t}" = "xyes" && \ test "x${ac_cv_func_lseek64}" = "xyes" && \ test "x${ac_cv_func_open64}" = "xyes" ; then AC_DEFINE(HAVE_TYPE_OFF64_T, 1, [Is off64_t in <sys/types.h>?]) AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi fi ]) |
︙ | ︙ | |||
2903 2904 2905 2906 2907 2908 2909 | #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> ]]) if test "x$NEED_FAKE_RFC2553" = "x1"; then AC_DEFINE([NEED_FAKE_RFC2553], 1, | | | 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 | #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> ]]) if test "x$NEED_FAKE_RFC2553" = "x1"; then AC_DEFINE([NEED_FAKE_RFC2553], 1, [Use compat implementation of getaddrinfo() and friends]) AC_LIBOBJ([fake-rfc2553]) AC_CHECK_FUNC(strlcpy) fi ]) #------------------------------------------------------------------------ # SC_CC_FOR_BUILD |
︙ | ︙ | |||
2926 2927 2928 2929 2930 2931 2932 | # EXEEXT_FOR_BUILD #------------------------------------------------------------------------ dnl Get a default for CC_FOR_BUILD to put into Makefile. AC_DEFUN([AX_CC_FOR_BUILD],[# Put a plausible default for CC_FOR_BUILD in Makefile. if test -z "$CC_FOR_BUILD"; then if test "x$cross_compiling" = "xno"; then | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 | # EXEEXT_FOR_BUILD #------------------------------------------------------------------------ dnl Get a default for CC_FOR_BUILD to put into Makefile. AC_DEFUN([AX_CC_FOR_BUILD],[# Put a plausible default for CC_FOR_BUILD in Makefile. if test -z "$CC_FOR_BUILD"; then if test "x$cross_compiling" = "xno"; then CC_FOR_BUILD='$(CC)' else AC_MSG_CHECKING([for gcc]) AC_CACHE_VAL(ac_cv_path_cc, [ search_path=`echo ${PATH} | sed -e 's/:/ /g'` for dir in $search_path ; do for j in `ls -r $dir/gcc 2> /dev/null` \ `ls -r $dir/gcc 2> /dev/null` ; do if test x"$ac_cv_path_cc" = x ; then if test -f "$j" ; then ac_cv_path_cc=$j break fi fi done done ]) fi fi AC_SUBST(CC_FOR_BUILD) # Also set EXEEXT_FOR_BUILD. if test "x$cross_compiling" = "xno"; then EXEEXT_FOR_BUILD='$(EXEEXT)' OBJEXT_FOR_BUILD='$(OBJEXT)' else OBJEXT_FOR_BUILD='.no' AC_CACHE_CHECK([for build system executable suffix], bfd_cv_build_exeext, [rm -f conftest* echo 'int main () { return 0; }' > conftest.c bfd_cv_build_exeext= ${CC_FOR_BUILD} -o conftest conftest.c 1>&5 2>&5 for file in conftest.*; do case $file in *.c | *.o | *.obj | *.ilk | *.pdb) ;; *) bfd_cv_build_exeext=`echo $file | sed -e s/conftest//` ;; esac done rm -f conftest* test x"${bfd_cv_build_exeext}" = x && bfd_cv_build_exeext=no]) EXEEXT_FOR_BUILD="" test x"${bfd_cv_build_exeext}" != xno && EXEEXT_FOR_BUILD=${bfd_cv_build_exeext} fi AC_SUBST(EXEEXT_FOR_BUILD)])dnl AC_SUBST(OBJEXT_FOR_BUILD)])dnl ]) |
︙ | ︙ | |||
3000 3001 3002 3003 3004 3005 3006 | ZIP_PROG_VFSSEARCH="" ZIP_INSTALL_OBJS="" AC_MSG_CHECKING([for macher]) AC_CACHE_VAL(ac_cv_path_macher, [ search_path=`echo ${PATH} | sed -e 's/:/ /g'` for dir in $search_path ; do | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 | ZIP_PROG_VFSSEARCH="" ZIP_INSTALL_OBJS="" AC_MSG_CHECKING([for macher]) AC_CACHE_VAL(ac_cv_path_macher, [ search_path=`echo ${PATH} | sed -e 's/:/ /g'` for dir in $search_path ; do for j in `ls -r $dir/macher 2> /dev/null` \ `ls -r $dir/macher 2> /dev/null` ; do if test x"$ac_cv_path_macher" = x ; then if test -f "$j" ; then ac_cv_path_macher=$j break fi fi done done ]) if test -f "$ac_cv_path_macher" ; then MACHER_PROG="$ac_cv_path_macher" AC_MSG_RESULT([$MACHER_PROG]) AC_MSG_RESULT([Found macher in environment]) fi AC_MSG_CHECKING([for zip]) AC_CACHE_VAL(ac_cv_path_zip, [ search_path=`echo ${PATH} | sed -e 's/:/ /g'` for dir in $search_path ; do for j in `ls -r $dir/zip 2> /dev/null` \ `ls -r $dir/zip 2> /dev/null` ; do if test x"$ac_cv_path_zip" = x ; then if test -f "$j" ; then ac_cv_path_zip=$j break fi fi done done ]) if test -f "$ac_cv_path_zip" ; then ZIP_PROG="$ac_cv_path_zip" AC_MSG_RESULT([$ZIP_PROG]) ZIP_PROG_OPTIONS="-rq" ZIP_PROG_VFSSEARCH="*" AC_MSG_RESULT([Found INFO Zip in environment]) # Use standard arguments for zip else # It is not an error if an installed version of Zip can't be located. # We can use the locally distributed minizip instead ZIP_PROG="./minizip${EXEEXT_FOR_BUILD}" ZIP_PROG_OPTIONS="-o -r" ZIP_PROG_VFSSEARCH="*" ZIP_INSTALL_OBJS="minizip${EXEEXT_FOR_BUILD}" AC_MSG_RESULT([No zip found on PATH. Building minizip]) fi AC_SUBST(MACHER_PROG) AC_SUBST(ZIP_PROG) AC_SUBST(ZIP_PROG_OPTIONS) AC_SUBST(ZIP_PROG_VFSSEARCH) AC_SUBST(ZIP_INSTALL_OBJS) ]) # Local Variables: # mode: autoconf # End: |
Changes to unix/tcl.spec.
1 2 3 4 5 6 | # This file is the basis for a binary Tcl RPM for Linux. %{!?directory:%define directory /usr/local} Name: tcl Summary: Tcl scripting language development environment | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | # This file is the basis for a binary Tcl RPM for Linux. %{!?directory:%define directory /usr/local} Name: tcl Summary: Tcl scripting language development environment Version: 9.0b4 Release: 2 License: BSD Group: Development/Languages Source: http://prdownloads.sourceforge.net/tcl/tcl%{version}-src.tar.gz URL: https://www.tcl-lang.org/ Buildroot: /var/tmp/%{name}%{version} |
︙ | ︙ |
Changes to unix/tclLoadAix.c.
︙ | ︙ | |||
249 250 251 252 253 254 255 | p++; } switch (atoi(s)) { /* INTL: "C", UTF safe. */ case L_ERROR_TOOMANY: strcat(errbuf, "to many errors"); break; case L_ERROR_NOLIB: | | | | 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 | p++; } switch (atoi(s)) { /* INTL: "C", UTF safe. */ case L_ERROR_TOOMANY: strcat(errbuf, "to many errors"); break; case L_ERROR_NOLIB: strcat(errbuf, "cannot load library"); strcat(errbuf, p); break; case L_ERROR_UNDEF: strcat(errbuf, "cannot find symbol"); strcat(errbuf, p); break; case L_ERROR_RLDBAD: strcat(errbuf, "bad RLD"); strcat(errbuf, p); break; case L_ERROR_FORMAT: |
︙ | ︙ |
Changes to unix/tclLoadDyld.c.
︙ | ︙ | |||
114 115 116 117 118 119 120 | case NSObjectFileImageInappropriateFile: return "not a Mach-O MH_BUNDLE file"; case NSObjectFileImageArch: return "no object for this architecture"; case NSObjectFileImageFormat: return "bad object file format"; case NSObjectFileImageAccess: | | | 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | case NSObjectFileImageInappropriateFile: return "not a Mach-O MH_BUNDLE file"; case NSObjectFileImageArch: return "no object for this architecture"; case NSObjectFileImageFormat: return "bad object file format"; case NSObjectFileImageAccess: return "cannot read object file"; default: return "unknown error"; } } #endif /* TCL_DYLD_USE_NSMODULE || TCL_LOAD_FROM_MEMORY */ /* |
︙ | ︙ |
Changes to unix/tclUnixChan.c.
︙ | ︙ | |||
8 9 10 11 12 13 14 15 16 17 18 19 20 21 | * Copyright © 1998-1999 Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. */ #include "tclInt.h" /* Internal definitions for Tcl. */ #include "tclIO.h" /* To get Channel type declaration. */ #undef SUPPORTS_TTY #if defined(HAVE_TERMIOS_H) # define SUPPORTS_TTY 1 # include <termios.h> # ifdef HAVE_SYS_IOCTL_H | > | 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | * Copyright © 1998-1999 Scriptics Corporation. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. */ #include "tclInt.h" /* Internal definitions for Tcl. */ #include "tclFileSystem.h" #include "tclIO.h" /* To get Channel type declaration. */ #undef SUPPORTS_TTY #if defined(HAVE_TERMIOS_H) # define SUPPORTS_TTY 1 # include <termios.h> # ifdef HAVE_SYS_IOCTL_H |
︙ | ︙ | |||
1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 | Tcl_Panic("TclpOpenFileChannel: invalid mode value"); return NULL; } native = (const char *)Tcl_FSGetNativePath(pathPtr); if (native == NULL) { if (interp != (Tcl_Interp *) NULL) { Tcl_AppendResult(interp, "couldn't open \"", TclGetString(pathPtr), "\": filename is invalid on this platform", (char *)NULL); } return NULL; } | > > > > > > > > > > > > > > > > > > > > | 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 | Tcl_Panic("TclpOpenFileChannel: invalid mode value"); return NULL; } native = (const char *)Tcl_FSGetNativePath(pathPtr); if (native == NULL) { if (interp != (Tcl_Interp *) NULL) { /* * We need this just to ensure we return the correct error messages under * some circumstances (relative paths only), so because the normalization * is very expensive, don't invoke it for native or absolute paths. * Note: since paths starting with ~ are absolute, it also considers tilde expansion, * (proper error message of tests *io-40.17 "tilde substitution in open") */ if ( ( ( !TclFSCwdIsNative() && (Tcl_FSGetPathType(pathPtr) != TCL_PATH_ABSOLUTE) ) || (*TclGetString(pathPtr) == '~') /* possible tilde expansion */ ) && Tcl_FSGetNormalizedPath(interp, pathPtr) == NULL ) { return NULL; } Tcl_AppendResult(interp, "couldn't open \"", TclGetString(pathPtr), "\": filename is invalid on this platform", (char *)NULL); } return NULL; } |
︙ | ︙ |
Changes to unix/tclUnixFCmd.c.
︙ | ︙ | |||
2062 2063 2064 2065 2066 2067 2068 | * Call 'realpath' to obtain a canonical path. */ #ifndef NO_REALPATH if (haveRealpath) { if (nextCheckpoint == 0) { /* | | | 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 | * Call 'realpath' to obtain a canonical path. */ #ifndef NO_REALPATH if (haveRealpath) { if (nextCheckpoint == 0) { /* * The path contains at most one component, e.g. '/foo' or '/', * so there is nothing to resolve. Also, on some platforms * 'Realpath' transforms an empty string into the normalized pwd, * which is the wrong answer. */ return 0; } |
︙ | ︙ | |||
2093 2094 2095 2096 2097 2098 2099 | Tcl_DStringFree(&ds); /* * Uncommenting this would mean that this native filesystem * routine claims the path is normalized if the file exists, * which would permit the caller to avoid iterating through | | | 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 | Tcl_DStringFree(&ds); /* * Uncommenting this would mean that this native filesystem * routine claims the path is normalized if the file exists, * which would permit the caller to avoid iterating through * other filesystems. Saving lots of calls is * probably worth the extra access() time, but in the common * case that no other filesystems are registered this is an * unnecessary expense. * if (0 == access(normPath, F_OK)) { return pathLen; } |
︙ | ︙ |
Changes to unix/tclUnixFile.c.
︙ | ︙ | |||
1115 1116 1117 1118 1119 1120 1121 | { char *nativePathPtr; const char *str; Tcl_DString ds; Tcl_Obj *validPathPtr; Tcl_Size len; | | | | 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 | { char *nativePathPtr; const char *str; Tcl_DString ds; Tcl_Obj *validPathPtr; Tcl_Size len; if (TclFSCwdIsNative() || Tcl_FSGetPathType(pathPtr) == TCL_PATH_ABSOLUTE) { /* * The cwd is native (or path is absolute), use the translated path * without worrying about normalization (this will also usually be * shorter so the utf-to-external conversion will be somewhat faster). */ validPathPtr = Tcl_FSGetTranslatedPath(NULL, pathPtr); if (validPathPtr == NULL) { return NULL; |
︙ | ︙ |
Changes to unix/tclUnixPipe.c.
︙ | ︙ | |||
424 425 426 427 428 429 430 | Tcl_Pid *pidPtr) /* If this function is successful, pidPtr is * filled with the process id of the child * process. */ { TclFile errPipeIn, errPipeOut; int count, status, fd; char errSpace[200 + TCL_INTEGER_SPACE]; | | | | 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 | Tcl_Pid *pidPtr) /* If this function is successful, pidPtr is * filled with the process id of the child * process. */ { TclFile errPipeIn, errPipeOut; int count, status, fd; char errSpace[200 + TCL_INTEGER_SPACE]; Tcl_DString *volatile dsArray; char **volatile newArgv; int pid; size_t i; #if defined(HAVE_POSIX_SPAWNP) int childErrno; static int use_spawn = -1; #endif |
︙ | ︙ |
Changes to unix/tclUnixTest.c.
︙ | ︙ | |||
205 206 207 208 209 210 211 | Tcl_PosixError(interp), (char *)NULL); return TCL_ERROR; } #ifdef O_NONBLOCK fcntl(GetFd(pipePtr->readFile), F_SETFL, O_NONBLOCK); fcntl(GetFd(pipePtr->writeFile), F_SETFL, O_NONBLOCK); #else | | | 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 | Tcl_PosixError(interp), (char *)NULL); return TCL_ERROR; } #ifdef O_NONBLOCK fcntl(GetFd(pipePtr->readFile), F_SETFL, O_NONBLOCK); fcntl(GetFd(pipePtr->writeFile), F_SETFL, O_NONBLOCK); #else Tcl_AppendResult(interp, "cannot make pipes non-blocking", (char *)NULL); return TCL_ERROR; #endif } pipePtr->readCount = 0; pipePtr->writeCount = 0; |
︙ | ︙ |
Changes to win/Makefile.in.
︙ | ︙ | |||
99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 | ROOT_DIR = @srcdir@/.. TOP_DIR = $(shell cd @srcdir@/..; pwd -W 2>/dev/null || pwd -P) BUILD_DIR = @builddir@ GENERIC_DIR = $(TOP_DIR)/generic WIN_DIR = $(TOP_DIR)/win COMPAT_DIR = $(TOP_DIR)/compat PKGS_DIR = $(TOP_DIR)/pkgs ZLIB_DIR = $(COMPAT_DIR)/zlib MINIZIP_DIR = $(ZLIB_DIR)/contrib/minizip TOMMATH_DIR = $(TOP_DIR)/libtommath # Converts a POSIX path to a Windows native path. CYGPATH = @CYGPATH@ libdir_native = $(shell $(CYGPATH) '$(libdir)') bindir_native = $(shell $(CYGPATH) '$(bindir)') includedir_native = $(shell $(CYGPATH) '$(includedir)') mandir_native = $(shell $(CYGPATH) '$(mandir)') TCL_LIBRARY_NATIVE = $(shell $(CYGPATH) '$(TCL_LIBRARY)') GENERIC_DIR_NATIVE = $(shell $(CYGPATH) '$(GENERIC_DIR)') WIN_DIR_NATIVE = $(shell $(CYGPATH) '$(WIN_DIR)') ROOT_DIR_NATIVE = $(shell $(CYGPATH) '$(ROOT_DIR)') SCRIPT_INSTALL_DIR_NATIVE = $(shell $(CYGPATH) '$(SCRIPT_INSTALL_DIR)') INCLUDE_INSTALL_DIR_NATIVE = $(shell $(CYGPATH) '$(INCLUDE_INSTALL_DIR)') MAN_INSTALL_DIR_NATIVE = $(shell $(CYGPATH) '$(MAN_INSTALL_DIR)') ROOT_DIR_WIN_NATIVE = $(shell cd '$(ROOT_DIR)' ; pwd -W 2>/dev/null || pwd -P) ZLIB_DIR_NATIVE = $(shell $(CYGPATH) '$(ZLIB_DIR)') MINIZIP_DIR_NATIVE = $(shell $(CYGPATH) '$(MINIZIP_DIR)') TOMMATH_DIR_NATIVE = $(shell $(CYGPATH) '$(TOMMATH_DIR)') | > > | 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | ROOT_DIR = @srcdir@/.. TOP_DIR = $(shell cd @srcdir@/..; pwd -W 2>/dev/null || pwd -P) BUILD_DIR = @builddir@ GENERIC_DIR = $(TOP_DIR)/generic WIN_DIR = $(TOP_DIR)/win COMPAT_DIR = $(TOP_DIR)/compat PKGS_DIR = $(TOP_DIR)/pkgs TOOL_DIR = $(TOP_DIR)/tools ZLIB_DIR = $(COMPAT_DIR)/zlib MINIZIP_DIR = $(ZLIB_DIR)/contrib/minizip TOMMATH_DIR = $(TOP_DIR)/libtommath # Converts a POSIX path to a Windows native path. CYGPATH = @CYGPATH@ libdir_native = $(shell $(CYGPATH) '$(libdir)') bindir_native = $(shell $(CYGPATH) '$(bindir)') includedir_native = $(shell $(CYGPATH) '$(includedir)') mandir_native = $(shell $(CYGPATH) '$(mandir)') TCL_LIBRARY_NATIVE = $(shell $(CYGPATH) '$(TCL_LIBRARY)') GENERIC_DIR_NATIVE = $(shell $(CYGPATH) '$(GENERIC_DIR)') WIN_DIR_NATIVE = $(shell $(CYGPATH) '$(WIN_DIR)') ROOT_DIR_NATIVE = $(shell $(CYGPATH) '$(ROOT_DIR)') TOOL_DIR_NATIVE = $(shell $(CYGPATH) '$(TOOL_DIR)') SCRIPT_INSTALL_DIR_NATIVE = $(shell $(CYGPATH) '$(SCRIPT_INSTALL_DIR)') INCLUDE_INSTALL_DIR_NATIVE = $(shell $(CYGPATH) '$(INCLUDE_INSTALL_DIR)') MAN_INSTALL_DIR_NATIVE = $(shell $(CYGPATH) '$(MAN_INSTALL_DIR)') ROOT_DIR_WIN_NATIVE = $(shell cd '$(ROOT_DIR)' ; pwd -W 2>/dev/null || pwd -P) ZLIB_DIR_NATIVE = $(shell $(CYGPATH) '$(ZLIB_DIR)') MINIZIP_DIR_NATIVE = $(shell $(CYGPATH) '$(MINIZIP_DIR)') TOMMATH_DIR_NATIVE = $(shell $(CYGPATH) '$(TOMMATH_DIR)') |
︙ | ︙ | |||
237 238 239 240 241 242 243 | ifeq ($(ZIPFS_BUILD), 0) LIBRARY_DIR1 = $(shell cd '$(ROOT_DIR_NATIVE)/library' ; pwd -P) LIBRARY_DIR = $(shell $(CYGPATH) '$(LIBRARY_DIR1)') endif # Minizip MINIZIP_OBJS = \ | | | | | | | | | | | | | | | | | 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 | ifeq ($(ZIPFS_BUILD), 0) LIBRARY_DIR1 = $(shell cd '$(ROOT_DIR_NATIVE)/library' ; pwd -P) LIBRARY_DIR = $(shell $(CYGPATH) '$(LIBRARY_DIR1)') endif # Minizip MINIZIP_OBJS = \ adler32.$(HOST_OBJEXT) \ compress.$(HOST_OBJEXT) \ crc32.$(HOST_OBJEXT) \ deflate.$(HOST_OBJEXT) \ infback.$(HOST_OBJEXT) \ inffast.$(HOST_OBJEXT) \ inflate.$(HOST_OBJEXT) \ inftrees.$(HOST_OBJEXT) \ ioapi.$(HOST_OBJEXT) \ iowin32.$(HOST_OBJEXT) \ trees.$(HOST_OBJEXT) \ uncompr.$(HOST_OBJEXT) \ zip.$(HOST_OBJEXT) \ zutil.$(HOST_OBJEXT) \ minizip.$(HOST_OBJEXT) ZIP_INSTALL_OBJS = @ZIP_INSTALL_OBJS@ CC_SWITCHES = -I"${BUILD_DIR}" -I"${GENERIC_DIR_NATIVE}" -I"${TOMMATH_DIR_NATIVE}" \ -I"${ZLIB_DIR_NATIVE}" -I"${WIN_DIR_NATIVE}" \ ${CFLAGS} ${CFLAGS_WARNING} ${SHLIB_CFLAGS} -DMP_PREC=4 \ ${AC_FLAGS} ${COMPILE_DEBUG_FLAGS} ${NO_DEPRECATED_FLAGS} |
︙ | ︙ | |||
336 337 338 339 340 341 342 343 344 345 346 347 348 349 | tclNotify.$(OBJEXT) \ tclOO.$(OBJEXT) \ tclOOBasic.$(OBJEXT) \ tclOOCall.$(OBJEXT) \ tclOODefineCmds.$(OBJEXT) \ tclOOInfo.$(OBJEXT) \ tclOOMethod.$(OBJEXT) \ tclOOStubInit.$(OBJEXT) \ tclObj.$(OBJEXT) \ tclOptimize.$(OBJEXT) \ tclPanic.$(OBJEXT) \ tclParse.$(OBJEXT) \ tclPathObj.$(OBJEXT) \ tclPipe.$(OBJEXT) \ | > | 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 | tclNotify.$(OBJEXT) \ tclOO.$(OBJEXT) \ tclOOBasic.$(OBJEXT) \ tclOOCall.$(OBJEXT) \ tclOODefineCmds.$(OBJEXT) \ tclOOInfo.$(OBJEXT) \ tclOOMethod.$(OBJEXT) \ tclOOProp.$(OBJEXT) \ tclOOStubInit.$(OBJEXT) \ tclObj.$(OBJEXT) \ tclOptimize.$(OBJEXT) \ tclPanic.$(OBJEXT) \ tclParse.$(OBJEXT) \ tclPathObj.$(OBJEXT) \ tclPipe.$(OBJEXT) \ |
︙ | ︙ | |||
539 540 541 542 543 544 545 | ${TCL_ZIP_FILE}: ${ZIP_INSTALL_OBJS} ${DDE_DLL_FILE} ${REG_DLL_FILE} @rm -rf ${TCL_VFS_ROOT} @mkdir -p ${TCL_VFS_PATH} @echo "creating ${TCL_VFS_PATH} (prepare compression)" @( \ $(COPY) -a $(TOP_DIR)/library/* ${TCL_VFS_PATH}; \ $(COPY) -a ${TCL_VFS_PATH}/manifest.txt ${TCL_VFS_PATH}/pkgIndex.tcl; \ | > | | > > > > | 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 | ${TCL_ZIP_FILE}: ${ZIP_INSTALL_OBJS} ${DDE_DLL_FILE} ${REG_DLL_FILE} @rm -rf ${TCL_VFS_ROOT} @mkdir -p ${TCL_VFS_PATH} @echo "creating ${TCL_VFS_PATH} (prepare compression)" @( \ $(COPY) -a $(TOP_DIR)/library/* ${TCL_VFS_PATH}; \ $(COPY) -a ${TCL_VFS_PATH}/manifest.txt ${TCL_VFS_PATH}/pkgIndex.tcl; \ if test "${ZIPFS_BUILD}" != "2" ; then \ $(COPY) ${DDE_DLL_FILE} ${TCL_VFS_PATH}/dde; \ $(COPY) ${REG_DLL_FILE} ${TCL_VFS_PATH}/registry; \ else \ rm -rf ${TCL_VFS_PATH}/dde; \ rm -rf ${TCL_VFS_PATH}/registry; \ fi \ ) (zip=`(realpath '${NATIVE_ZIP}' || readlink -m '${NATIVE_ZIP}') 2>/dev/null || \ (echo '${NATIVE_ZIP}' | sed "s?^\./?$$(pwd)/?")`; \ cd ${TCL_VFS_ROOT} && \ $$zip ${ZIP_PROG_OPTIONS} ../${TCL_ZIP_FILE} ${ZIP_PROG_VFSSEARCH} >/dev/null && \ echo "${TCL_ZIP_FILE} successful created with $$zip" && \ cd ..) |
︙ | ︙ | |||
614 615 616 617 618 619 620 | @$(RM) ${TEST_DLL_FILE} ${TEST_LIB_FILE} @MAKE_DLL@ ${TCLTEST_OBJS} $(TCL_STUB_LIB_FILE) $(SHLIB_LD_LIBS) $(COPY) tclsh.exe.manifest ${TEST_DLL_FILE}.manifest ${TEST_EXE_FILE}: ${TCL_STUB_LIB_FILE} ${TCLTEST_OBJS} tclTestMain.${OBJEXT} @$(RM) ${TEST_EXE_FILE} $(CC) $(CFLAGS) $(TCLTEST_OBJS) tclTestMain.$(OBJEXT) $(TCL_LIB_FILE) $(TCL_STUB_LIB_FILE) $(LIBS) \ | | | 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 | @$(RM) ${TEST_DLL_FILE} ${TEST_LIB_FILE} @MAKE_DLL@ ${TCLTEST_OBJS} $(TCL_STUB_LIB_FILE) $(SHLIB_LD_LIBS) $(COPY) tclsh.exe.manifest ${TEST_DLL_FILE}.manifest ${TEST_EXE_FILE}: ${TCL_STUB_LIB_FILE} ${TCLTEST_OBJS} tclTestMain.${OBJEXT} @$(RM) ${TEST_EXE_FILE} $(CC) $(CFLAGS) $(TCLTEST_OBJS) tclTestMain.$(OBJEXT) $(TCL_LIB_FILE) $(TCL_STUB_LIB_FILE) $(LIBS) \ tclsh.$(RES) $(CC_EXENAME) $(LDFLAGS_CONSOLE) $(COPY) tclsh.exe.manifest ${TEST_EXE_FILE}.manifest # use prebuilt zlib1.dll ${ZLIB_DLL_FILE}: ${TCL_STUB_LIB_FILE} @if test "@ZLIB_LIBS@set" = "${ZLIB_DIR_NATIVE}/win64-arm/zdll.libset" ; then \ $(COPY) $(ZLIB_DIR)/win64-arm/${ZLIB_DLL_FILE} ${ZLIB_DLL_FILE}; \ elif test "@ZLIB_LIBS@set" = "${ZLIB_DIR_NATIVE}/win64-arm/libz.dll.aset" ; then \ |
︙ | ︙ | |||
924 925 926 927 928 929 930 | done; @echo "Installing library files to $(SCRIPT_INSTALL_DIR)"; @for i in $(ROOT_DIR)/library/*.tcl $(ROOT_DIR)/library/tclIndex; do \ $(COPY) "$$i" "$(SCRIPT_INSTALL_DIR)"; \ done; @echo "Installing package cookiejar 0.2" @for j in $(ROOT_DIR)/library/cookiejar/*.tcl \ | | | | | 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 | done; @echo "Installing library files to $(SCRIPT_INSTALL_DIR)"; @for i in $(ROOT_DIR)/library/*.tcl $(ROOT_DIR)/library/tclIndex; do \ $(COPY) "$$i" "$(SCRIPT_INSTALL_DIR)"; \ done; @echo "Installing package cookiejar 0.2" @for j in $(ROOT_DIR)/library/cookiejar/*.tcl \ $(ROOT_DIR)/library/cookiejar/*.gz; do \ $(COPY) "$$j" "$(SCRIPT_INSTALL_DIR)/cookiejar0.2"; \ done; @echo "Installing package http 2.10b4 as a Tcl Module"; @$(COPY) $(ROOT_DIR)/library/http/http.tcl "$(MODULE_INSTALL_DIR)/9.0/http-2.10b4.tm"; @echo "Installing package opt 0.4.7"; @for j in $(ROOT_DIR)/library/opt/*.tcl; do \ $(COPY) "$$j" "$(SCRIPT_INSTALL_DIR)/opt0.4"; \ done; @echo "Installing package msgcat 1.7.1 as a Tcl Module"; @$(COPY) $(ROOT_DIR)/library/msgcat/msgcat.tcl "$(MODULE_INSTALL_DIR)/9.0/msgcat-1.7.1.tm"; @echo "Installing package tcltest 2.5.8 as a Tcl Module"; |
︙ | ︙ | |||
1069 1070 1071 1072 1073 1074 1075 | @builddir=`$(CYGPATH) $$(pwd -P)`; \ for i in $(PKGS_DIR)/*; do \ if [ -d $$i ] ; then \ if [ -x $$i/configure ] ; then \ pkg=`basename $$i`; \ mkdir -p $(PKG_DIR)/$$pkg; \ if [ ! -f $(PKG_DIR)/$$pkg/Makefile ]; then \ | | | | | | | | | | < < < < < < < < < < > > > > > > > > > > | | | 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 | @builddir=`$(CYGPATH) $$(pwd -P)`; \ for i in $(PKGS_DIR)/*; do \ if [ -d $$i ] ; then \ if [ -x $$i/configure ] ; then \ pkg=`basename $$i`; \ mkdir -p $(PKG_DIR)/$$pkg; \ if [ ! -f $(PKG_DIR)/$$pkg/Makefile ]; then \ ( cd $(PKG_DIR)/$$pkg; \ echo "Configuring package '$$i' wd = `$(CYGPATH) $$(pwd -P)`"; \ $$i/configure --with-tcl=$$builddir --with-tclinclude=$(GENERIC_DIR_NATIVE) $(PKG_CFG_ARGS) --enable-shared; ) \ fi ; \ echo "Building package '$$pkg'"; \ ( cd $(PKG_DIR)/$$pkg; $(MAKE); ) \ fi; \ fi; \ done; \ cd $$builddir install-packages: packages @builddir=`pwd -P`; \ for i in $(PKGS_DIR)/*; do \ if [ -d $$i ]; then \ pkg=`basename $$i`; \ if [ -f $(PKG_DIR)/$$pkg/Makefile ]; then \ echo "Installing package '$$pkg'"; \ ( cd $(PKG_DIR)/$$pkg; $(MAKE) install "DESTDIR=$(INSTALL_ROOT)"; ) \ fi; \ fi; \ done; \ cd $$builddir test-packages: tcltest packages @builddir=`pwd -P`; \ for i in $(PKGS_DIR)/*; do \ if [ -d $$i ]; then \ pkg=`basename $$i`; \ if [ -f $(PKG_DIR)/$$pkg/Makefile ]; then \ echo "Testing package '$$pkg'"; \ ( cd $(PKG_DIR)/$$pkg; $(MAKE) "LD_LIBRARY_PATH=$$builddir:${LD_LIBRARY_PATH}" "TCL_LIBRARY=${TCL_BUILDTIME_LIBRARY}" "TCLLIBPATH=$$builddir/pkgs" test "TCLSH_PROG=$$builddir/${TCLSH}"; ) \ fi; \ fi; \ done; \ cd $$builddir clean-packages: @builddir=`pwd -P`; \ for i in $(PKGS_DIR)/*; do \ if [ -d $$i ]; then \ pkg=`basename $$i`; \ if [ -f $(PKG_DIR)/$$pkg/Makefile ]; then \ ( cd $(PKG_DIR)/$$pkg; $(MAKE) clean; ) \ fi; \ fi; \ done; \ cd $$builddir distclean-packages: @builddir=`pwd -P`; \ for i in $(PKGS_DIR)/*; do \ if [ -d $$i ]; then \ pkg=`basename $$i`; \ if [ -f $(PKG_DIR)/$$pkg/Makefile ]; then \ ( cd $(PKG_DIR)/$$pkg; $(MAKE) distclean; ) \ fi; \ cd $$builddir; \ rm -rf $(PKG_DIR)/$$pkg; \ fi; \ done; \ rm -rf $(PKG_DIR) # # Regenerate the stubs files. # $(GENERIC_DIR)/tclStubInit.c: $(GENERIC_DIR)/tcl.decls \ $(GENERIC_DIR)/tclInt.decls @echo "Warning: tclStubInit.c may be out of date." @echo "Developers may want to run \"make genstubs\" to regenerate." @echo "This warning can be safely ignored, do not report as a bug!" $(GENERIC_DIR)/tclOOScript.h: $(TOOL_DIR)/tclOOScript.tcl @echo "Warning: tclOOScript.h may be out of date." @echo "Developers may want to run \"make genscript\" to regenerate." @echo "This warning can be safely ignored, do not report as a bug!" genstubs: $(TCL_EXE) "$(TOOL_DIR_NATIVE)/genStubs.tcl" \ "$(GENERIC_DIR_NATIVE)" \ "$(GENERIC_DIR_NATIVE)/tcl.decls" \ "$(GENERIC_DIR_NATIVE)/tclInt.decls" \ "$(GENERIC_DIR_NATIVE)/tclTomMath.decls" $(TCL_EXE) "$(TOOL_DIR_NATIVE)/genStubs.tcl" \ "$(GENERIC_DIR_NATIVE)" \ "$(GENERIC_DIR_NATIVE)/tclOO.decls" genscript: $(TCL_EXE) "$(TOOL_DIR_NATIVE)/makeHeader.tcl" \ "$(TOOL_DIR_NATIVE)/tclOOScript.tcl" \ "$(GENERIC_DIR_NATIVE)/tclOOScript.h" # # This target creates the HTML folder for Tcl & Tk and places it in # DISTDIR/html. It uses the tcltk-man2html.tcl tool from the Tcl group's tool # workspace. It depends on the Tcl & Tk being in directories called tcl9.* & # tk8.* up two directories from the TOOL_DIR. |
︙ | ︙ |
Changes to win/configure.
︙ | ︙ | |||
2407 2408 2409 2410 2411 2412 2413 | # versions of autoconf incorrectly set SHELL to /bin/bash instead of # /bin/sh. The bash shell seems to suffer from some strange failures. SHELL=/bin/sh TCL_VERSION=9.0 TCL_MAJOR_VERSION=9 TCL_MINOR_VERSION=0 | | | 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 | # versions of autoconf incorrectly set SHELL to /bin/bash instead of # /bin/sh. The bash shell seems to suffer from some strange failures. SHELL=/bin/sh TCL_VERSION=9.0 TCL_MAJOR_VERSION=9 TCL_MINOR_VERSION=0 TCL_PATCH_LEVEL="b4" VER=$TCL_MAJOR_VERSION$TCL_MINOR_VERSION TCL_DDE_VERSION=1.4 TCL_DDE_MAJOR_VERSION=1 TCL_DDE_MINOR_VERSION=4 DDEVER=$TCL_DDE_MAJOR_VERSION$TCL_DDE_MINOR_VERSION |
︙ | ︙ | |||
4185 4186 4187 4188 4189 4190 4191 | CYGPATH=echo fi conftest= cyg_conftest= fi if test "$CYGPATH" = "echo"; then | | | | 4185 4186 4187 4188 4189 4190 4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 | CYGPATH=echo fi conftest= cyg_conftest= fi if test "$CYGPATH" = "echo"; then DEPARG='"$<"' else DEPARG='"$(shell $(CYGPATH) $<)"' fi # set various compiler flags depending on whether we are using gcc or cl if test "${GCC}" = "yes" ; then extra_cflags="-pipe" extra_ldflags="-pipe -static-libgcc" |
︙ | ︙ | |||
4431 4432 4433 4434 4435 4436 4437 | rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_enable_auto_image_base" >&5 printf "%s\n" "$ac_cv_enable_auto_image_base" >&6; } CFLAGS=$hold_cflags | | | 4431 4432 4433 4434 4435 4436 4437 4438 4439 4440 4441 4442 4443 4444 4445 | rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_enable_auto_image_base" >&5 printf "%s\n" "$ac_cv_enable_auto_image_base" >&6; } CFLAGS=$hold_cflags if test "$ac_cv_enable_auto_image_base" = "yes" ; then extra_ldflags="$extra_ldflags -Wl,--enable-auto-image-base" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking compiler flags" >&5 printf %s "checking compiler flags... " >&6; } if test "${GCC}" = "yes" ; then SHLIB_LD="" |
︙ | ︙ | |||
4457 4458 4459 4460 4461 4462 4463 | MAKE_STUB_LIB="\${STLIB_LD} \$@" POST_MAKE_LIB="\${RANLIB} \$@" MAKE_EXE="\${CC} -o \$@" LIBPREFIX="lib" if test "${SHARED_BUILD}" = "0" ; then # static | | | | | 4457 4458 4459 4460 4461 4462 4463 4464 4465 4466 4467 4468 4469 4470 4471 4472 4473 4474 4475 4476 4477 4478 4479 4480 4481 4482 4483 4484 | MAKE_STUB_LIB="\${STLIB_LD} \$@" POST_MAKE_LIB="\${RANLIB} \$@" MAKE_EXE="\${CC} -o \$@" LIBPREFIX="lib" if test "${SHARED_BUILD}" = "0" ; then # static { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: using static flags" >&5 printf "%s\n" "using static flags" >&6; } runtime= LIBRARIES="\${STATIC_LIBRARIES}" EXESUFFIX="s.exe" else # dynamic { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: using shared flags" >&5 printf "%s\n" "using shared flags" >&6; } # ad-hoc check to see if CC supports -shared. if "${CC}" -shared 2>&1 | egrep ': -shared not supported' >/dev/null; then as_fn_error $? "${CC} does not support the -shared option. You will need to upgrade to a newer version of the toolchain." "$LINENO" 5 fi runtime= # Add SHLIB_LD_LIBS to the Make rule, not here. EXESUFFIX=".exe" LIBRARIES="\${SHARED_LIBRARIES}" |
︙ | ︙ | |||
4582 4583 4584 4585 4586 4587 4588 | printf "%s\n" " Using 64-bit $MACHINE mode" >&6; } fi ;; esac else if test "${SHARED_BUILD}" = "0" ; then # static | | | | 4582 4583 4584 4585 4586 4587 4588 4589 4590 4591 4592 4593 4594 4595 4596 4597 4598 4599 4600 4601 4602 4603 | printf "%s\n" " Using 64-bit $MACHINE mode" >&6; } fi ;; esac else if test "${SHARED_BUILD}" = "0" ; then # static { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: using static flags" >&5 printf "%s\n" "using static flags" >&6; } runtime=-MT LIBRARIES="\${STATIC_LIBRARIES}" EXESUFFIX="s.exe" else # dynamic { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: using shared flags" >&5 printf "%s\n" "using shared flags" >&6; } runtime=-MD # Add SHLIB_LD_LIBS to the Make rule, not here. LIBRARIES="\${SHARED_LIBRARIES}" EXESUFFIX=".exe" case "x`echo \${VisualStudioVersion}`" in x1[4-9]*) |
︙ | ︙ | |||
4956 4957 4958 4959 4960 4961 4962 | printf "%s\n" "#define MP_64BIT 1" >>confdefs.h if test "$do64bit" = "arm64" then : | | | 4956 4957 4958 4959 4960 4961 4962 4963 4964 4965 4966 4967 4968 4969 4970 | printf "%s\n" "#define MP_64BIT 1" >>confdefs.h if test "$do64bit" = "arm64" then : if test "$GCC" = "yes" then : ZLIB_LIBS=\${ZLIB_DIR_NATIVE}/win64-arm/libz.dll.a TOMMATH_LIBS=\${TOMMATH_DIR_NATIVE}/win64-arm/libtommath.dll.a zlib_lib_name=libz.dll.a |
︙ | ︙ | |||
4978 4979 4980 4981 4982 4983 4984 | ;; esac fi else case e in #( e) | | | 4978 4979 4980 4981 4982 4983 4984 4985 4986 4987 4988 4989 4990 4991 4992 | ;; esac fi else case e in #( e) if test "$GCC" = "yes" then : ZLIB_LIBS=\${ZLIB_DIR_NATIVE}/win64/libz.dll.a TOMMATH_LIBS=\${TOMMATH_DIR_NATIVE}/win64/libtommath.dll.a zlib_lib_name=libz.dll.a |
︙ | ︙ | |||
5189 5190 5191 5192 5193 5194 5195 | if test ${ac_cv_path_zip+y} then : printf %s "(cached) " >&6 else case e in #( e) search_path=`echo ${PATH} | sed -e 's/:/ /g'` for dir in $search_path ; do | | | | | | | | | | | | | | | | | | | | | | | | 5189 5190 5191 5192 5193 5194 5195 5196 5197 5198 5199 5200 5201 5202 5203 5204 5205 5206 5207 5208 5209 5210 5211 5212 5213 5214 5215 5216 5217 5218 5219 5220 5221 5222 5223 5224 5225 5226 5227 5228 5229 5230 5231 5232 5233 | if test ${ac_cv_path_zip+y} then : printf %s "(cached) " >&6 else case e in #( e) search_path=`echo ${PATH} | sed -e 's/:/ /g'` for dir in $search_path ; do for j in `ls -r $dir/zip 2> /dev/null` \ `ls -r $dir/zip 2> /dev/null` ; do if test x"$ac_cv_path_zip" = x ; then if test -f "$j" ; then ac_cv_path_zip=$j break fi fi done done ;; esac fi if test -f "$ac_cv_path_zip" ; then ZIP_PROG="$ac_cv_path_zip" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ZIP_PROG" >&5 printf "%s\n" "$ZIP_PROG" >&6; } ZIP_PROG_OPTIONS="-rq" ZIP_PROG_VFSSEARCH="*" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: Found INFO Zip in environment" >&5 printf "%s\n" "Found INFO Zip in environment" >&6; } # Use standard arguments for zip else # It is not an error if an installed version of Zip can't be located. # We can use the locally distributed minizip instead ZIP_PROG="./minizip${EXEEXT_FOR_BUILD}" ZIP_PROG_OPTIONS="-o -r" ZIP_PROG_VFSSEARCH="*" ZIP_INSTALL_OBJS="minizip${EXEEXT_FOR_BUILD}" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: No zip found on PATH building minizip" >&5 printf "%s\n" "No zip found on PATH building minizip" >&6; } fi |
︙ | ︙ |
Changes to win/configure.ac.
︙ | ︙ | |||
11 12 13 14 15 16 17 | # versions of autoconf incorrectly set SHELL to /bin/bash instead of # /bin/sh. The bash shell seems to suffer from some strange failures. SHELL=/bin/sh TCL_VERSION=9.0 TCL_MAJOR_VERSION=9 TCL_MINOR_VERSION=0 | | | 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | # versions of autoconf incorrectly set SHELL to /bin/bash instead of # /bin/sh. The bash shell seems to suffer from some strange failures. SHELL=/bin/sh TCL_VERSION=9.0 TCL_MAJOR_VERSION=9 TCL_MINOR_VERSION=0 TCL_PATCH_LEVEL="b4" VER=$TCL_MAJOR_VERSION$TCL_MINOR_VERSION TCL_DDE_VERSION=1.4 TCL_DDE_MAJOR_VERSION=1 TCL_DDE_MINOR_VERSION=4 DDEVER=$TCL_DDE_MAJOR_VERSION$TCL_DDE_MINOR_VERSION |
︙ | ︙ | |||
126 127 128 129 130 131 132 | AS_IF([test "$tcl_ok" = "yes"], [ AC_SUBST(ZLIB_DLL_FILE,[\${ZLIB_DLL_FILE}]) AC_SUBST(TOMMATH_DLL_FILE,[\${TOMMATH_DLL_FILE}]) AC_DEFINE(TCL_WITH_EXTERNAL_TOMMATH, 1, [Tcl with external libtommath]) AS_IF([test "$do64bit" != "no"], [ AC_DEFINE(MP_64BIT, 1, [Using libtommath.dll in 64-bit mode]) AS_IF([test "$do64bit" = "arm64"], [ | | | | 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 | AS_IF([test "$tcl_ok" = "yes"], [ AC_SUBST(ZLIB_DLL_FILE,[\${ZLIB_DLL_FILE}]) AC_SUBST(TOMMATH_DLL_FILE,[\${TOMMATH_DLL_FILE}]) AC_DEFINE(TCL_WITH_EXTERNAL_TOMMATH, 1, [Tcl with external libtommath]) AS_IF([test "$do64bit" != "no"], [ AC_DEFINE(MP_64BIT, 1, [Using libtommath.dll in 64-bit mode]) AS_IF([test "$do64bit" = "arm64"], [ AS_IF([test "$GCC" = "yes"],[ AC_SUBST(ZLIB_LIBS,[\${ZLIB_DIR_NATIVE}/win64-arm/libz.dll.a]) AC_SUBST(TOMMATH_LIBS,[\${TOMMATH_DIR_NATIVE}/win64-arm/libtommath.dll.a]) zlib_lib_name=libz.dll.a tommath_lib_name=libtommath.dll.a ], [ AC_SUBST(ZLIB_LIBS,[\${ZLIB_DIR_NATIVE}/win64-arm/zdll.lib]) AC_SUBST(TOMMATH_LIBS,[\${TOMMATH_DIR_NATIVE}/win64-arm/tommath.lib]) ]) ], [ AS_IF([test "$GCC" = "yes"],[ AC_SUBST(ZLIB_LIBS,[\${ZLIB_DIR_NATIVE}/win64/libz.dll.a]) AC_SUBST(TOMMATH_LIBS,[\${TOMMATH_DIR_NATIVE}/win64/libtommath.dll.a]) zlib_lib_name=libz.dll.a tommath_lib_name=libtommath.dll.a ], [ AC_SUBST(ZLIB_LIBS,[\${ZLIB_DIR_NATIVE}/win64/zdll.lib]) AC_SUBST(TOMMATH_LIBS,[\${TOMMATH_DIR_NATIVE}/win64/tommath.lib]) |
︙ | ︙ |
Changes to win/makefile.vc.
︙ | ︙ | |||
297 298 299 300 301 302 303 304 305 306 307 308 309 310 | $(TMP_DIR)\tclNotify.obj \ $(TMP_DIR)\tclOO.obj \ $(TMP_DIR)\tclOOBasic.obj \ $(TMP_DIR)\tclOOCall.obj \ $(TMP_DIR)\tclOODefineCmds.obj \ $(TMP_DIR)\tclOOInfo.obj \ $(TMP_DIR)\tclOOMethod.obj \ $(TMP_DIR)\tclOOStubInit.obj \ $(TMP_DIR)\tclObj.obj \ $(TMP_DIR)\tclOptimize.obj \ $(TMP_DIR)\tclPanic.obj \ $(TMP_DIR)\tclParse.obj \ $(TMP_DIR)\tclPathObj.obj \ $(TMP_DIR)\tclPipe.obj \ | > | 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 | $(TMP_DIR)\tclNotify.obj \ $(TMP_DIR)\tclOO.obj \ $(TMP_DIR)\tclOOBasic.obj \ $(TMP_DIR)\tclOOCall.obj \ $(TMP_DIR)\tclOODefineCmds.obj \ $(TMP_DIR)\tclOOInfo.obj \ $(TMP_DIR)\tclOOMethod.obj \ $(TMP_DIR)\tclOOProp.obj \ $(TMP_DIR)\tclOOStubInit.obj \ $(TMP_DIR)\tclObj.obj \ $(TMP_DIR)\tclOptimize.obj \ $(TMP_DIR)\tclPanic.obj \ $(TMP_DIR)\tclParse.obj \ $(TMP_DIR)\tclPathObj.obj \ $(TMP_DIR)\tclPipe.obj \ |
︙ | ︙ | |||
702 703 704 705 706 707 708 709 710 711 712 713 714 715 | clean-pkgs: @for /d %d in ($(PKGSDIR)\*) do \ @if exist "%~fd\win\makefile.vc" ( \ pushd "%~fd\win" & \ $(MAKE) -$(MAKEFLAGS) -f makefile.vc TCLDIR=$(ROOT) clean &\ popd \ ) #--------------------------------------------------------------------- # Regenerate the stubs files. [Development use only] #--------------------------------------------------------------------- genstubs: !if !exist($(TCLSH)) | > > > > > > > > | 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 | clean-pkgs: @for /d %d in ($(PKGSDIR)\*) do \ @if exist "%~fd\win\makefile.vc" ( \ pushd "%~fd\win" & \ $(MAKE) -$(MAKEFLAGS) -f makefile.vc TCLDIR=$(ROOT) clean &\ popd \ ) hose-pkgs: @for /d %d in ($(PKGSDIR)\*) do \ @if exist "%~fd\win\makefile.vc" ( \ pushd "%~fd\win" & \ $(MAKE) -$(MAKEFLAGS) -f makefile.vc TCLDIR=$(ROOT) hose &\ popd \ ) #--------------------------------------------------------------------- # Regenerate the stubs files. [Development use only] #--------------------------------------------------------------------- genstubs: !if !exist($(TCLSH)) |
︙ | ︙ | |||
792 793 794 795 796 797 798 | #--------------------------------------------------------------------- tclConfig: $(OUT_DIR)\tclConfig.sh # TBD - is this tclConfig.sh file ever used? The values are incorrect! $(OUT_DIR)\tclConfig.sh: $(WIN_DIR)\tclConfig.sh.in @echo Creating tclConfig.sh | | | 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 | #--------------------------------------------------------------------- tclConfig: $(OUT_DIR)\tclConfig.sh # TBD - is this tclConfig.sh file ever used? The values are incorrect! $(OUT_DIR)\tclConfig.sh: $(WIN_DIR)\tclConfig.sh.in @echo Creating tclConfig.sh @nmakehlp -s << $** >$@ @TCL_DLL_FILE@ $(TCLLIBNAME) @TCL_VERSION@ $(DOTVERSION) @TCL_MAJOR_VERSION@ $(TCL_MAJOR_VERSION) @TCL_MINOR_VERSION@ $(TCL_MINOR_VERSION) @TCL_PATCH_LEVEL@ $(TCL_PATCH_LEVEL) @CC@ $(CC) @DEFS@ $(pkgcflags) |
︙ | ︙ | |||
876 877 878 879 880 881 882 | copy $(WIN_DIR)\gitmanifest.in $(ROOT)\manifest.uuid git rev-parse HEAD >>$(ROOT)\manifest.uuid $(TMP_DIR)\tclUuid.h: $(ROOT)\manifest.uuid copy $(WIN_DIR)\tclUuid.h.in+$(ROOT)\manifest.uuid $(TMP_DIR)\tclUuid.h $(TMP_DIR)\tclEvent.obj: $(GENERICDIR)\tclEvent.c $(TMP_DIR)\tclUuid.h | | | 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 | copy $(WIN_DIR)\gitmanifest.in $(ROOT)\manifest.uuid git rev-parse HEAD >>$(ROOT)\manifest.uuid $(TMP_DIR)\tclUuid.h: $(ROOT)\manifest.uuid copy $(WIN_DIR)\tclUuid.h.in+$(ROOT)\manifest.uuid $(TMP_DIR)\tclUuid.h $(TMP_DIR)\tclEvent.obj: $(GENERICDIR)\tclEvent.c $(TMP_DIR)\tclUuid.h $(cc32) $(pkgcflags) -I$(COMPATDIR)\zlib -I$(TMP_DIR) \ -Fo$@ $(GENERICDIR)\tclEvent.c $(TMP_DIR)\tclTest.obj: $(GENERICDIR)\tclTest.c $(TMP_DIR)\tclUuid.h $(cc32) $(appcflags) -I$(TMP_DIR) \ -Fo$@ $(GENERICDIR)\tclTest.c $(TMP_DIR)\tclTestObj.obj: $(GENERICDIR)\tclTestObj.c |
︙ | ︙ | |||
1183 1184 1185 1186 1187 1188 1189 | @if exist $(TCLTEST) del $(TCLTEST) @echo Removing $(TCLDDELIB) ... @if exist $(TCLDDELIB) del $(TCLDDELIB) @echo Removing $(TCLREGLIB) ... @if exist $(TCLREGLIB) del $(TCLREGLIB) clean: default-clean clean-pkgs | | | 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 | @if exist $(TCLTEST) del $(TCLTEST) @echo Removing $(TCLDDELIB) ... @if exist $(TCLDDELIB) del $(TCLDDELIB) @echo Removing $(TCLREGLIB) ... @if exist $(TCLREGLIB) del $(TCLREGLIB) clean: default-clean clean-pkgs hose: default-hose hose-pkgs realclean: hose .PHONY: # Local Variables: # mode: makefile # End: |
Changes to win/rules.vc.
︙ | ︙ | |||
1131 1132 1133 1134 1135 1136 1137 | STUBPREFIX = $(PROJECT)stub # # Set up paths to various Tcl executables and libraries needed by extensions # # TIP 430. Unused for 8.6 but no harm defining it to allow a common rules.vc | | | | | 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 | STUBPREFIX = $(PROJECT)stub # # Set up paths to various Tcl executables and libraries needed by extensions # # TIP 430. Unused for 8.6 but no harm defining it to allow a common rules.vc TCL_ZIP_FILE = libtcl$(TCL_MAJOR_VERSION).$(TCL_MINOR_VERSION)$(TCL_PATCH_LETTER)$(TCL_RELEASE_SERIAL).zip TK_ZIP_FILE = libtk$(TK_MAJOR_VERSION).$(TK_MINOR_VERSION)$(TK_PATCH_LETTER)$(TK_RELEASE_SERIAL).zip !if $(DOING_TCL) TCLSHNAME = $(PROJECT)sh$(VERSION)$(SUFX).exe TCLSH = $(OUT_DIR)\$(TCLSHNAME) TCLIMPLIB = $(OUT_DIR)\$(PROJECT)$(VERSION)$(SUFX).lib TCLLIBNAME = $(PROJECT)$(VERSION)$(SUFX).$(EXT) TCLLIB = $(OUT_DIR)\$(TCLLIBNAME) TCLSCRIPTZIP = $(OUT_DIR)\$(TCL_ZIP_FILE) !if $(TCL_MAJOR_VERSION) == 8 TCLSTUBLIBNAME = $(STUBPREFIX)$(VERSION).lib !else TCLSTUBLIBNAME = $(STUBPREFIX).lib !endif TCLSTUBLIB = $(OUT_DIR)\$(TCLSTUBLIBNAME) |
︙ | ︙ | |||
1176 1177 1178 1179 1180 1181 1182 | # "t" suffix (e.g. 8.5 or 8.7). If lib not found check for that possibility. !if !exist("$(TCLIMPLIB)") TCLIMPLIB = $(_TCLDIR)\lib\tcl$(TCL_VERSION)t$(SUFX:t=).lib !endif TCL_LIBRARY = $(_TCLDIR)\lib TCLREGLIB = $(_TCLDIR)\lib\tclreg13$(SUFX:t=).lib TCLDDELIB = $(_TCLDIR)\lib\tcldde14$(SUFX:t=).lib | | | 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 | # "t" suffix (e.g. 8.5 or 8.7). If lib not found check for that possibility. !if !exist("$(TCLIMPLIB)") TCLIMPLIB = $(_TCLDIR)\lib\tcl$(TCL_VERSION)t$(SUFX:t=).lib !endif TCL_LIBRARY = $(_TCLDIR)\lib TCLREGLIB = $(_TCLDIR)\lib\tclreg13$(SUFX:t=).lib TCLDDELIB = $(_TCLDIR)\lib\tcldde14$(SUFX:t=).lib TCLSCRIPTZIP = $(_TCLDIR)\lib\$(TCL_ZIP_FILE) TCLTOOLSDIR = \must\have\tcl\sources\to\build\this\target TCL_INCLUDES = -I"$(_TCLDIR)\include" !else # Building against Tcl sources TCLSH = $(_TCLDIR)\win\$(BUILDDIRTOP)\tclsh$(TCL_VERSION)$(SUFX:t=).exe !if !exist($(TCLSH)) |
︙ | ︙ | |||
1200 1201 1202 1203 1204 1205 1206 | # "t" suffix (e.g. 8.5 or 8.7). If lib not found check for that possibility. !if !exist("$(TCLIMPLIB)") TCLIMPLIB = $(_TCLDIR)\win\$(BUILDDIRTOP)\tcl$(TCL_VERSION)t$(SUFX:t=).lib !endif TCL_LIBRARY = $(_TCLDIR)\library TCLREGLIB = $(_TCLDIR)\win\$(BUILDDIRTOP)\tclreg13$(SUFX:t=).lib TCLDDELIB = $(_TCLDIR)\win\$(BUILDDIRTOP)\tcldde14$(SUFX:t=).lib | | | 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 | # "t" suffix (e.g. 8.5 or 8.7). If lib not found check for that possibility. !if !exist("$(TCLIMPLIB)") TCLIMPLIB = $(_TCLDIR)\win\$(BUILDDIRTOP)\tcl$(TCL_VERSION)t$(SUFX:t=).lib !endif TCL_LIBRARY = $(_TCLDIR)\library TCLREGLIB = $(_TCLDIR)\win\$(BUILDDIRTOP)\tclreg13$(SUFX:t=).lib TCLDDELIB = $(_TCLDIR)\win\$(BUILDDIRTOP)\tcldde14$(SUFX:t=).lib TCLSCRIPTZIP = $(_TCLDIR)\win\$(BUILDDIRTOP)\$(TCL_ZIP_FILE) TCLTOOLSDIR = $(_TCLDIR)\tools TCL_INCLUDES = -I"$(_TCLDIR)\generic" -I"$(_TCLDIR)\win" !endif # TCLINSTALL !if !$(STATIC_BUILD) && "$(TCL_BUILD_FOR)" == "8" tcllibs = "$(TCLSTUBLIB)" |
︙ | ︙ | |||
1249 1250 1251 1252 1253 1254 1255 | !if $(DOING_TK) WISH = $(OUT_DIR)\$(WISHNAME) TKSTUBLIB = $(OUT_DIR)\$(TKSTUBLIBNAME) TKIMPLIB = $(OUT_DIR)\$(TKIMPLIBNAME) TKLIB = $(OUT_DIR)\$(TKLIBNAME) TK_INCLUDES = -I"$(WIN_DIR)" -I"$(GENERICDIR)" | | | | | 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 | !if $(DOING_TK) WISH = $(OUT_DIR)\$(WISHNAME) TKSTUBLIB = $(OUT_DIR)\$(TKSTUBLIBNAME) TKIMPLIB = $(OUT_DIR)\$(TKIMPLIBNAME) TKLIB = $(OUT_DIR)\$(TKLIBNAME) TK_INCLUDES = -I"$(WIN_DIR)" -I"$(GENERICDIR)" TKSCRIPTZIP = $(OUT_DIR)\$(TK_ZIP_FILE) !else # effectively NEED_TK !if $(TKINSTALL) # Building against installed Tk WISH = $(_TKDIR)\bin\$(WISHNAME) TKSTUBLIB = $(_TKDIR)\lib\$(TKSTUBLIBNAME) TKIMPLIB = $(_TKDIR)\lib\$(TKIMPLIBNAME) # When building extensions, may be linking against Tk that does not add # "t" suffix (e.g. 8.5 or 8.7). If lib not found check for that possibility. !if !exist("$(TKIMPLIB)") TKIMPLIBNAME = tk$(TK_VERSION)$(SUFX:t=).lib TKIMPLIB = $(_TKDIR)\lib\$(TKIMPLIBNAME) !endif TK_INCLUDES = -I"$(_TKDIR)\include" TKSCRIPTZIP = $(_TKDIR)\lib\$(TK_ZIP_FILE) !else # Building against Tk sources WISH = $(_TKDIR)\win\$(BUILDDIRTOP)\$(WISHNAME) TKSTUBLIB = $(_TKDIR)\win\$(BUILDDIRTOP)\$(TKSTUBLIBNAME) TKIMPLIB = $(_TKDIR)\win\$(BUILDDIRTOP)\$(TKIMPLIBNAME) # When building extensions, may be linking against Tk that does not add # "t" suffix (e.g. 8.5 or 8.7). If lib not found check for that possibility. !if !exist("$(TKIMPLIB)") TKIMPLIBNAME = tk$(TK_VERSION)$(SUFX:t=).lib TKIMPLIB = $(_TKDIR)\win\$(BUILDDIRTOP)\$(TKIMPLIBNAME) !endif TK_INCLUDES = -I"$(_TKDIR)\generic" -I"$(_TKDIR)\win" -I"$(_TKDIR)\xlib" TKSCRIPTZIP = $(_TKDIR)\win\$(BUILDDIRTOP)\$(TK_ZIP_FILE) !endif # TKINSTALL tklibs = "$(TKSTUBLIB)" "$(TKIMPLIB)" !endif # $(DOING_TK) !endif # $(DOING_TK) || $(NEED_TK) |
︙ | ︙ | |||
1442 1443 1444 1445 1446 1447 1448 | OPTDEFINES = $(OPTDEFINES) /DNO_STRTOI64=1 !endif !if $(TCL_MAJOR_VERSION) == 8 !if "$(_USE_64BIT_TIME_T)" == "1" OPTDEFINES = $(OPTDEFINES) /D_USE_64BIT_TIME_T=1 !endif | < < < | | | | 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 | OPTDEFINES = $(OPTDEFINES) /DNO_STRTOI64=1 !endif !if $(TCL_MAJOR_VERSION) == 8 !if "$(_USE_64BIT_TIME_T)" == "1" OPTDEFINES = $(OPTDEFINES) /D_USE_64BIT_TIME_T=1 !endif !endif !if "$(TCL_BUILD_FOR)" == "8" OPTDEFINES = $(OPTDEFINES) /DTCL_MAJOR_VERSION=8 !endif # Like the TEA system only set this non empty for non-Tk extensions # Note: some extensions use PACKAGE_NAME and others use PACKAGE_TCLNAME # so we pass both !if !$(DOING_TCL) && !$(DOING_TK) PKGNAMEFLAGS = /DPACKAGE_NAME="\"$(PRJ_PACKAGE_TCLNAME)\"" \ /DPACKAGE_TCLNAME="\"$(PRJ_PACKAGE_TCLNAME)\"" \ /DPACKAGE_VERSION="\"$(DOTVERSION)\"" \ /DMODULE_SCOPE=extern !endif # crt picks the C run time based on selected OPTS !if $(MSVCRT) !if $(DEBUG) && !$(UNCHECKED) crt = -MDd !else |
︙ | ︙ | |||
1794 1795 1796 1797 1798 1799 1800 | #endif FILEOS VOS_NT_WINDOWS32 FILETYPE VFT_DLL FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN | | | | | | | | | | | 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 | #endif FILEOS VOS_NT_WINDOWS32 FILETYPE VFT_DLL FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904b0" BEGIN VALUE "FileDescription", "Tcl extension " PROJECT VALUE "OriginalFilename", PRJLIBNAME VALUE "FileVersion", DOTVERSION VALUE "ProductName", "Package " PROJECT " for Tcl" VALUE "ProductVersion", DOTVERSION END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1200 END END << !endif # ifdef RCFILE |
︙ | ︙ |
Changes to win/tcl.m4.
︙ | ︙ | |||
254 255 256 257 258 259 260 | # #------------------------------------------------------------------------ AC_DEFUN([SC_LOAD_TCLCONFIG], [ AC_MSG_CHECKING([for existence of ${TCL_BIN_DIR}/tclConfig.sh]) if test -f "${TCL_BIN_DIR}/tclConfig.sh" ; then | | | | | | | 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 | # #------------------------------------------------------------------------ AC_DEFUN([SC_LOAD_TCLCONFIG], [ AC_MSG_CHECKING([for existence of ${TCL_BIN_DIR}/tclConfig.sh]) if test -f "${TCL_BIN_DIR}/tclConfig.sh" ; then AC_MSG_RESULT([loading]) . "${TCL_BIN_DIR}/tclConfig.sh" else AC_MSG_RESULT([could not find ${TCL_BIN_DIR}/tclConfig.sh]) fi # # If the TCL_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TCL_LIB_SPEC will be set to the value # of TCL_BUILD_LIB_SPEC. An extension should make use of TCL_LIB_SPEC # instead of TCL_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. # if test -f $TCL_BIN_DIR/Makefile ; then TCL_LIB_SPEC=${TCL_BUILD_LIB_SPEC} TCL_STUB_LIB_SPEC=${TCL_BUILD_STUB_LIB_SPEC} TCL_STUB_LIB_PATH=${TCL_BUILD_STUB_LIB_PATH} fi eval "TCL_STUB_LIB_FILE=\"${TCL_STUB_LIB_FILE}\"" eval "TCL_STUB_LIB_FLAG=\"${TCL_STUB_LIB_FLAG}\"" eval "TCL_STUB_LIB_SPEC=\"${TCL_STUB_LIB_SPEC}\"" AC_SUBST(TCL_VERSION) |
︙ | ︙ | |||
314 315 316 317 318 319 320 | # TK_BIN_DIR #------------------------------------------------------------------------ AC_DEFUN([SC_LOAD_TKCONFIG], [ AC_MSG_CHECKING([for existence of ${TK_BIN_DIR}/tkConfig.sh]) if test -f "${TK_BIN_DIR}/tkConfig.sh" ; then | | | | 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 | # TK_BIN_DIR #------------------------------------------------------------------------ AC_DEFUN([SC_LOAD_TKCONFIG], [ AC_MSG_CHECKING([for existence of ${TK_BIN_DIR}/tkConfig.sh]) if test -f "${TK_BIN_DIR}/tkConfig.sh" ; then AC_MSG_RESULT([loading]) . "${TK_BIN_DIR}/tkConfig.sh" else AC_MSG_RESULT([could not find ${TK_BIN_DIR}/tkConfig.sh]) fi AC_SUBST(TK_BIN_DIR) AC_SUBST(TK_SRC_DIR) AC_SUBST(TK_LIB_FILE) ]) |
︙ | ︙ | |||
566 567 568 569 570 571 572 | CYGPATH=echo fi conftest= cyg_conftest= fi if test "$CYGPATH" = "echo"; then | | | | 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 | CYGPATH=echo fi conftest= cyg_conftest= fi if test "$CYGPATH" = "echo"; then DEPARG='"$<"' else DEPARG='"$(shell $(CYGPATH) $<)"' fi # set various compiler flags depending on whether we are using gcc or cl if test "${GCC}" = "yes" ; then extra_cflags="-pipe" extra_ldflags="-pipe -static-libgcc" |
︙ | ︙ | |||
640 641 642 643 644 645 646 | AC_CACHE_CHECK(for working --enable-auto-image-base, ac_cv_enable_auto_image_base, AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [ac_cv_enable_auto_image_base=yes], [ac_cv_enable_auto_image_base=no]) ) CFLAGS=$hold_cflags | | | 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 | AC_CACHE_CHECK(for working --enable-auto-image-base, ac_cv_enable_auto_image_base, AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], [ac_cv_enable_auto_image_base=yes], [ac_cv_enable_auto_image_base=no]) ) CFLAGS=$hold_cflags if test "$ac_cv_enable_auto_image_base" = "yes" ; then extra_ldflags="$extra_ldflags -Wl,--enable-auto-image-base" fi AC_MSG_CHECKING([compiler flags]) if test "${GCC}" = "yes" ; then SHLIB_LD="" SHLIB_LD_LIBS='${LIBS}' |
︙ | ︙ | |||
665 666 667 668 669 670 671 | MAKE_STUB_LIB="\${STLIB_LD} \[$]@" POST_MAKE_LIB="\${RANLIB} \[$]@" MAKE_EXE="\${CC} -o \[$]@" LIBPREFIX="lib" if test "${SHARED_BUILD}" = "0" ; then # static | | | | | 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 | MAKE_STUB_LIB="\${STLIB_LD} \[$]@" POST_MAKE_LIB="\${RANLIB} \[$]@" MAKE_EXE="\${CC} -o \[$]@" LIBPREFIX="lib" if test "${SHARED_BUILD}" = "0" ; then # static AC_MSG_RESULT([using static flags]) runtime= LIBRARIES="\${STATIC_LIBRARIES}" EXESUFFIX="s.exe" else # dynamic AC_MSG_RESULT([using shared flags]) # ad-hoc check to see if CC supports -shared. if "${CC}" -shared 2>&1 | egrep ': -shared not supported' >/dev/null; then AC_MSG_ERROR([${CC} does not support the -shared option. You will need to upgrade to a newer version of the toolchain.]) fi runtime= # Add SHLIB_LD_LIBS to the Make rule, not here. EXESUFFIX=".exe" LIBRARIES="\${SHARED_LIBRARIES}" |
︙ | ︙ | |||
768 769 770 771 772 773 774 | AC_MSG_RESULT([ Using 64-bit $MACHINE mode]) fi ;; esac else if test "${SHARED_BUILD}" = "0" ; then # static | | | | 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 | AC_MSG_RESULT([ Using 64-bit $MACHINE mode]) fi ;; esac else if test "${SHARED_BUILD}" = "0" ; then # static AC_MSG_RESULT([using static flags]) runtime=-MT LIBRARIES="\${STATIC_LIBRARIES}" EXESUFFIX="s.exe" else # dynamic AC_MSG_RESULT([using shared flags]) runtime=-MD # Add SHLIB_LD_LIBS to the Make rule, not here. LIBRARIES="\${SHARED_LIBRARIES}" EXESUFFIX=".exe" case "x`echo \${VisualStudioVersion}`" in x1[[4-9]]*) lflags="${lflags} -nodefaultlib:libucrt.lib" |
︙ | ︙ | |||
1242 1243 1244 1245 1246 1247 1248 | ZIP_PROG_VFSSEARCH="" ZIP_INSTALL_OBJS="" AC_MSG_CHECKING([for zip]) AC_CACHE_VAL(ac_cv_path_zip, [ search_path=`echo ${PATH} | sed -e 's/:/ /g'` for dir in $search_path ; do | | | | | | | | | | | | | | | | | | | | | | | | 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 | ZIP_PROG_VFSSEARCH="" ZIP_INSTALL_OBJS="" AC_MSG_CHECKING([for zip]) AC_CACHE_VAL(ac_cv_path_zip, [ search_path=`echo ${PATH} | sed -e 's/:/ /g'` for dir in $search_path ; do for j in `ls -r $dir/zip 2> /dev/null` \ `ls -r $dir/zip 2> /dev/null` ; do if test x"$ac_cv_path_zip" = x ; then if test -f "$j" ; then ac_cv_path_zip=$j break fi fi done done ]) if test -f "$ac_cv_path_zip" ; then ZIP_PROG="$ac_cv_path_zip" AC_MSG_RESULT([$ZIP_PROG]) ZIP_PROG_OPTIONS="-rq" ZIP_PROG_VFSSEARCH="*" AC_MSG_RESULT([Found INFO Zip in environment]) # Use standard arguments for zip else # It is not an error if an installed version of Zip can't be located. # We can use the locally distributed minizip instead ZIP_PROG="./minizip${EXEEXT_FOR_BUILD}" ZIP_PROG_OPTIONS="-o -r" ZIP_PROG_VFSSEARCH="*" ZIP_INSTALL_OBJS="minizip${EXEEXT_FOR_BUILD}" AC_MSG_RESULT([No zip found on PATH building minizip]) fi AC_SUBST(ZIP_PROG) AC_SUBST(ZIP_PROG_OPTIONS) AC_SUBST(ZIP_PROG_VFSSEARCH) AC_SUBST(ZIP_INSTALL_OBJS) ]) |
Changes to win/tclWinChan.c.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | /* * tclWinChan.c * * Channel drivers for Windows channels based on files, command pipes and * TCP sockets. * * Copyright © 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution of * this file, and for a DISCLAIMER OF ALL WARRANTIES. */ #include "tclWinInt.h" #include "tclIO.h" /* * State flags used in the info structures below. */ #define FILE_PENDING (1<<0) /* Message is pending in the queue. */ | > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | /* * tclWinChan.c * * Channel drivers for Windows channels based on files, command pipes and * TCP sockets. * * Copyright © 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution of * this file, and for a DISCLAIMER OF ALL WARRANTIES. */ #include "tclWinInt.h" #include "tclFileSystem.h" #include "tclIO.h" /* * State flags used in the info structures below. */ #define FILE_PENDING (1<<0) /* Message is pending in the queue. */ |
︙ | ︙ | |||
992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 | HANDLE handle; char channelName[16 + TCL_INTEGER_SPACE]; TclFile readFile = NULL, writeFile = NULL; nativeName = (const WCHAR *)Tcl_FSGetNativePath(pathPtr); if (nativeName == NULL) { if (interp) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "couldn't open \"%s\": filename is invalid on this platform", TclGetString(pathPtr))); } return NULL; } | > > > > > > > > > > > > > > > > > | 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 | HANDLE handle; char channelName[16 + TCL_INTEGER_SPACE]; TclFile readFile = NULL, writeFile = NULL; nativeName = (const WCHAR *)Tcl_FSGetNativePath(pathPtr); if (nativeName == NULL) { if (interp) { /* * We need this just to ensure we return the correct error messages under * some circumstances (relative paths only), so because the normalization * is very expensive, don't invoke it for native or absolute paths. * Note: since paths starting with ~ are relative in 9.0 for windows, * it doesn't need to consider tilde expansion (in opposite to 8.x). */ if ( ( !TclFSCwdIsNative() && (Tcl_FSGetPathType(pathPtr) != TCL_PATH_ABSOLUTE) ) && Tcl_FSGetNormalizedPath(interp, pathPtr) == NULL ) { return NULL; } Tcl_SetObjResult(interp, Tcl_ObjPrintf( "couldn't open \"%s\": filename is invalid on this platform", TclGetString(pathPtr))); } return NULL; } |
︙ | ︙ |
Changes to win/tclWinConsole.c.
︙ | ︙ | |||
1478 1479 1480 1481 1482 1483 1484 | *---------------------------------------------------------------------- */ static void ConsoleWatchProc( void *instanceData, /* Console state. */ int newMask) /* What events to watch for, one of | | | 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 | *---------------------------------------------------------------------- */ static void ConsoleWatchProc( void *instanceData, /* Console state. */ int newMask) /* What events to watch for, one of * TCL_READABLE, TCL_WRITABLE */ { ConsoleChannelInfo **nextPtrPtr, *ptr; ConsoleChannelInfo *chanInfoPtr = (ConsoleChannelInfo *)instanceData; int oldMask = chanInfoPtr->watchMask; /* * Since most of the work is handled by the background threads, we just |
︙ | ︙ | |||
1715 1716 1717 1718 1719 1720 1721 | consoleHandle = handleInfoPtr->console; ReleaseSRWLockExclusive(&handleInfoPtr->lock); NudgeWatchers(consoleHandle); AcquireSRWLockExclusive(&handleInfoPtr->lock); /* * Loop back to recheck for exit conditions changes while the | | | 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 | consoleHandle = handleInfoPtr->console; ReleaseSRWLockExclusive(&handleInfoPtr->lock); NudgeWatchers(consoleHandle); AcquireSRWLockExclusive(&handleInfoPtr->lock); /* * Loop back to recheck for exit conditions changes while the * lock was not held. */ continue; } assert(inputLen == 0); /* |
︙ | ︙ |
Changes to win/tclWinFile.c.
︙ | ︙ | |||
3019 3020 3021 3022 3023 3024 3025 | { WCHAR *nativePathPtr = NULL; const char *str; Tcl_Obj *validPathPtr; Tcl_Size len; WCHAR *wp; | | | | 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 | { WCHAR *nativePathPtr = NULL; const char *str; Tcl_Obj *validPathPtr; Tcl_Size len; WCHAR *wp; if (TclFSCwdIsNative() || Tcl_FSGetPathType(pathPtr) == TCL_PATH_ABSOLUTE) { /* * The cwd is native (or path is absolute), use the translated path * without worrying about normalization (this will also usually be * shorter so the utf-to-external conversion will be somewhat faster). */ validPathPtr = Tcl_FSGetTranslatedPath(NULL, pathPtr); if (validPathPtr == NULL) { return NULL; |
︙ | ︙ | |||
3140 3141 3142 3143 3144 3145 3146 | /* * In the remainder of the path, translate invalid characters to * characters in the Unicode private use area. */ while (*wp != '\0') { | | | 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 | /* * In the remainder of the path, translate invalid characters to * characters in the Unicode private use area. */ while (*wp != '\0') { if ((*wp < ' ') || wcschr(L"\"*<>?|", *wp)) { *wp |= 0xF000; } else if (*wp == '/') { *wp = '\\'; } ++wp; } |
︙ | ︙ |
Changes to win/tclWinReg.c.
︙ | ︙ | |||
48 49 50 51 52 53 54 | #define SWAPWORD(x) MAKEWORD(HIBYTE(x), LOBYTE(x)) #define SWAPLONG(x) MAKELONG(SWAPWORD(HIWORD(x)), SWAPWORD(LOWORD(x))) /* * The following flag is used in OpenKeys to indicate that the specified key * should be created if it doesn't currently exist. */ | | | > | 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | #define SWAPWORD(x) MAKEWORD(HIBYTE(x), LOBYTE(x)) #define SWAPLONG(x) MAKELONG(SWAPWORD(HIWORD(x)), SWAPWORD(LOWORD(x))) /* * The following flag is used in OpenKeys to indicate that the specified key * should be created if it doesn't currently exist. */ enum OpenKeysFlags { REG_CREATE = 1 }; /* * The following tables contain the mapping from registry root names to the * system predefined keys. */ static const char *const rootKeyNames[] = { |
︙ | ︙ | |||
382 383 384 385 386 387 388 | HKEY key; /* * Create the key and then close it immediately. */ mode |= KEY_ALL_ACCESS; | | | 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 | HKEY key; /* * Create the key and then close it immediately. */ mode |= KEY_ALL_ACCESS; if (OpenKey(interp, objv[n], mode, REG_CREATE, &key) != TCL_OK) { return TCL_ERROR; } RegCloseKey(key); return TCL_OK; } else if (argc == 3) { return SetValue(interp, objv[n], objv[n+1], objv[n+2], NULL, mode); |
︙ | ︙ | |||
1306 1307 1308 1309 1310 1311 1312 | 0, (int *) &type) != TCL_OK) { if (Tcl_GetIntFromObj(NULL, typeObj, (int *) &type) != TCL_OK) { return TCL_ERROR; } Tcl_ResetResult(interp); } mode |= KEY_ALL_ACCESS; | | | 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 | 0, (int *) &type) != TCL_OK) { if (Tcl_GetIntFromObj(NULL, typeObj, (int *) &type) != TCL_OK) { return TCL_ERROR; } Tcl_ResetResult(interp); } mode |= KEY_ALL_ACCESS; if (OpenKey(interp, keyNameObj, mode, REG_CREATE, &key) != TCL_OK) { return TCL_ERROR; } valueName = Tcl_GetStringFromObj(valueNameObj, &len); Tcl_DStringInit(&nameBuf); valueName = (char *) Tcl_UtfToWCharDString(valueName, len, &nameBuf); |
︙ | ︙ |
Added win/vctool.bat.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 | @echo off REM Pass /? as argument for usage. IF DEFINED VCINSTALLDIR goto setup echo "Not in a Visual Studio command prompt." exit /B 1 :setup setlocal REM Get the current directory set "currentDir=%CD%" REM Use FOR command to get the parent directory for %%I in ("%currentDir%") do set "parentDir=%%~dpI" REM Remove the trailing backslash set "parentDir=%parentDir:~0,-1%" REM Use FOR command again to get the parent of the parent directory for %%J in ("%parentDir%") do set "grandParentDir=%%~dpJ" REM Remove the trailing backslash set "grandParentDir=%grandParentDir:~0,-1%" REM Use FOR command to extract the last component for %%I in ("%grandParentDir%") do set "grandParentTail=%%~nxI" REM Extract the drive letter for %%I in ("%currentDir%") do set "driveLetter=%%~dI" set ARCH=%VSCMD_ARG_TGT_ARCH% if "%TCLINSTALLROOT%" == "" ( set INSTROOT=%driveLetter%\Tcl\%grandParentTail%\%ARCH% ) else ( set INSTROOT=%TCLINSTALLROOT%\%grandParentTail%\%ARCH% ) REM Parse options :options if "%1" == "" goto dobuilds if "%1" == "/?" goto help if "%1" == "-?" goto help if /i "%1" == "/help" goto help if "%1" == "all" goto all if "%1" == "shared" goto shared if "%1" == "static" goto static if "%1" == "shared_noembed" goto shared_noembed if "%1" == "static_noembed" goto static_noembed if "%1" == "compile" goto compile if "%1" == "test" goto targets if "%1" == "install" goto targets if "%1" == "runshell" goto targets if "%1" == "pdbs" goto pdbs goto help :pdbs set pdbs=1 shift goto options :shared set shared=1 shift goto options :static set static=1 shift goto options :shared_noembed set shared_noembed=1 shift goto options :static_noembed set static_noembed=1 shift goto options :all set shared=1 set static=1 set shared_noembed=1 set static_noembed=1 shift goto options :targets set TARGETS=%TARGETS% %1 shift goto options REM The makefile.vc compilation target is called "release" :compile set TARGETS=%TARGETS% release shift goto options :dobuilds if "%shared%%static%%shared_noembed%%static_noembed%" == "" ( echo At least one of shared, static, shared_noembed, static_noembed, all must be specified. echo For more help, type "%0 help" goto error ) if DEFINED shared ( call :runmake shared ) if DEFINED shared_noembed ( call :runmake shared-noembed noembed ) if DEFINED static ( call :runmake static static ) if DEFINED static_noembed ( call :runmake static-noembed "static,noembed" ) :done endlocal exit /b 0 :error endlocal exit /b 1 :: call :runmake dir opts :runmake if "%pdbs%" == "" ( nmake /s /f makefile.vc OUT_DIR=%currentDir%\vc-%ARCH%-%1 TMP_DIR=%currentDir%\vc-%ARCH%-%1\objs OPTS=pdbs,%2 INSTALLDIR=%INSTROOT%-%1 %TARGETS% && goto error ) else ( nmake /s /f makefile.vc OUT_DIR=%currentDir%\vc-%ARCH%-%1-debug TMP_DIR=%currentDir%\vc-%ARCH%-%1-debug\objs OPTS=pdbs,%2 cdebug="-Zi -Od" INSTALLDIR=%INSTROOT%-%1-debug %TARGETS% && goto error ) goto eof :help echo. echo Usage: %0 arg ... echo. echo where each arg may be either a build config or a target or "debug". echo. echo Configs: shared, static, shared_noembed, static_noembed, all echo Targets: compile (default), test, install echo. echo Multiple configs and targets may be specified and intermixed. echo At least one config must be specified. If no targets specified, echo default is compile. If multiple targets are present, they echo are built in specified order. echo. echo If "debug" is supplied as an argument, the build has optimizations echo disabled and full debug information. echo. echo If environment variable TCLINSTALLROOT is defined, install target echo will be subdirectory under it named after the grandparent of the echo current directory. TCLINSTALLROOT defaults to the X:\Tcl where echo X is the current drive. echo. echo For example, if the current directory C:\src\core-8-branch\tcl\win, echo install directories will be echo under c:\Tcl\core-8-branch\ as echo x64-shared, x64-static etc. or x64-shared-debug etc. if "pdbs" passed. echo. echo Examples: echo %0 shared (Builds default "shared" config) echo %0 shared test (Tests shared build) echo %0 static compile test (Builds and tests static build) echo %0 all debug (Build debug versions of all configs) echo %0 all compile install debug (Builds and installs all configs) echo %0 shared static shared_noembed (Builds three configs) goto done |